[英]TypeError: string indices must be integers, why?
我有
TypeError:字符串索引必須是整數
這些代碼,請幫助我找到一個錯誤,我不知道如何解決它
from xml.etree import cElementTree as ET
from collections import defaultdict
def etree_to_dict(t):
d = {t.tag: {} if t.attrib else None}
children = list(t)
if children:
dd = defaultdict(list)
for dc in map(etree_to_dict, children):
for k, v in dc.items():
dd[k].append(v)
d = {t.tag: {k: v[0] if len(v) == 1 else v for k, v in dd.items()}}
if t.attrib:
d[t.tag].update(('@' + k, v) for k, v in t.attrib.items())
if t.text:
text = t.text.strip()
if children or t.attrib:
if text:
d[t.tag]['#text'] = text
else:
d[t.tag] = text
return d
我認為問題在這里
e = ET.parse('adversolutions.xml')
d = etree_to_dict(e.getroot())
products = d['yml_catalog']['shop5']
for p in products:
product = Product()
product.name = p['name']
product.description = p['description']
product.price = p['price']
product.category = p['category']
product.external_url = p['url']
product.category_id = p['categoryId']
product.currencies = p['currencies']
product.save()
所有這一切反序列化xml並保存數據和django
模型所有回溯:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/alexandr/beo/lib/python3.4/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "/home/alexandr/beo/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute
django.setup()
File "/home/alexandr/beo/lib/python3.4/site-packages/django/__init__.py", line 21, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/alexandr/beo/lib/python3.4/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/home/alexandr/beo/lib/python3.4/site-packages/django/apps/config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "/home/alexandr/beo/lib/python3.4/importlib/__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
File "<frozen importlib._bootstrap>", line 1129, in _exec
File "<frozen importlib._bootstrap>", line 1471, in exec_module
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "/home/alexandr/beo/posts/models.py", line 9, in <module>
from products.models import Product
File "/home/alexandr/beo/products/models.py", line 155, in <module>
product.name = p['name']
TypeError: string indices must be integers
用這條線所有作品
products = d['yml_catalog']['shop5']
問題從這里開始:
for p in products:
product = Product()
product.name = p['name']
product.description = p['description']
product.price = p['price']
product.category = p['category']
product.external_url = p['url']
product.category_id = p['categoryId']
product.currencies = p['currencies']
product.save()
打印(產品):大型xml文件的安全性
'@available': 'true', 'param': {'@name': 'Размер', '@unit': 'INT', '#text': 'L'}, '@id': '117213', 'name': 'Штаны Pocket Grey', 'oldprice': '1990', '@group_id': '1172', 'description': None, 'picture': 'http:///upload/iblock/559/559b4fe1c3b397bf84eb16686bd5aadf.jpg', 'url': 'http:///catalog/shtany/galife_pocket_grey/', 'currencyId': 'RUB', 'price': '1990'}, {'vendor': 'Envy Lab', '@available': 'true', 'param': {'@name': 'Размер', '@unit': 'INT', '#text': 'S'}, '@id': '117511', 'name': 'Галифе Dark Black', 'oldprice': '1990', '@group_id': '1175', 'description': None, 'picture': 'http:///upload/iblock/11d/11d1c223f4e65b347cd5823fff9e5e9b.jpg', 'url': 'http:///catalog/shtany/galife_dark_black/', 'currencyId': 'RUB', 'price': '1990'}, {'vendor': 'Envy Lab', '@available': 'true', 'param': {'@name': 'Размер', '@unit': 'INT', '#text': 'M'}, '@id': '117512', 'name': 'Галифе Dark Black', 'oldprice': '1990', '@group_id': '1175', 'description': None, 'picture': 'http:///upload/iblock/11d/11d1c223f4e65b347cd5823fff9e5e9b.jpg', 'url': 'http:///catalog/shtany/galife_dark_black/', 'currencyId': 'RUB', 'price': '1990'}, {'vendor': 'Envy Lab', '@available': 'true', 'param': {'@name': 'Размер', '@unit': 'INT', '#text': 'L'}, '@id': '117513', 'name': 'Галифе Dark Black', 'oldprice': '1990', '@group_id': '1175', 'description': None, 'picture': 'http:///upload/iblock/11d/11d1c223f4e65b347cd5823fff9e5e9b.jpg', 'url': 'http:///catalog/shtany/galife_dark_black/', 'currencyId': 'RUB', 'price': '1990'}]}, 'url': 'http://www.envylab.ru', 'name': 'Envylab', 'categories': {'category': [{'#text': 'Поло', '@id': '61'}, {'#text': 'Толстовки', '@id': '65'}, {'#text': 'Штаны', '@id': '72'}, {'#text': 'Шапки', '@id': '74'}, {'#text': 'Рубашки', '@id': '76'}]}, 'company': 'Envylab'}
打印(p):結果之一
categories
打印(類型(產品))
<class 'dict'>
你有一個回溯說
product.name = p['name']
TypeError: string indices must be integers
這意味着p顯然是一個字符串,而您試圖像字典一樣使用它。
您說對了,這個問題就出現在這里(盡管它可能是您到達那里之前的一個問題):
products = d['yml_catalog']['shop5']
# Please add this print
print(products)
print(type(products))
for p in products:
# Please add this print
print(p)
product = Product()
product.name = p['name']
...
顯然,您希望products
是詞典列表,但是您會獲得字符串列表。
通過在循環之前和/或循環開始處打印p
來打印products
,應該很容易進行驗證。
print
是一種出色且簡單的調試工具,非常適合此類問題。
目前尚不清楚什么products
。 您也可以打印其類型(請參見上面的編輯代碼)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.