TypeError: string indices doivent être des entiers, pourquoi?
j'ai
TypeError: string indices doivent être des entiers
avec ces codes, de m'aider à trouver un bug s'il vous plaît, je ne sais pas comment le résoudre
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
Je pense que le problème est ici
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()
tout cela pour désérialiser xml et enregistrer les données et le modèle django
tous les traceback:
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
avec cette ligne fonctionne tous les
products = d['yml_catalog']['shop5']
problème commence ici:
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()
d'impression(produits):
la paix de gros fichier 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'}
d'impression(p):
l'un des résultats
categories
print(type(produits))
<class 'dict'>
- normalement, un rapport d'erreur sera signalée à l'encontre d'une ligne spécifique qui vous ai pas réussi à inclure
- post le plein de sperme veuillez
- imprimer les résultats de cette ligne
products = d['yml_catalog']['shop5']
et l'ajouter à la question
Vous devez vous connecter pour publier un commentaire.
Vous avez un traceback qui dit
ce qui signifie que, apparemment, p est une chaîne de caractères, tandis que vous essayez de l'utiliser comme un dictionnaire.
Vous avez raison, la question apparaît ici (bien qu'il vient probablement d'un problème avant d'y arriver):
Apparemment, vous vous attendez à
products
à une liste de dictionnaires, mais vous obtenez une liste de chaînes de caractères.Il devrait être facile à vérifier par l'impression
products
avant la boucle et/oup
au début de la boucle.print
est une grande et simple outil de débogage, bien adapté pour ce genre de questions.Modifier
Il est difficile de savoir ce que
products
est. Vous pouvez également imprimer son type (voir édité code ci-dessus).d['yml_catalog']['shop5']
et de l'impression, il devrait vous aider à savoir quel est le problème.type(products)
. Et assurez-vous que vous avez copié entièrement à vous remettre en question.p['name']
,p['category']
, etc. de sorte qu'il ressemble vous savez ce que vous vous attendez à obtenir de la .fichier xml. Apparemment, vous obtenez quelque chose d'autre. Difficile de dire en quoi et pourquoi, avec seulement une partie de la production, mais vous devriez être capable de trier par des produits d'impression et de recherche pour la partie que vous voulez. Il pourrait être vous avez besoin d'accéder à une sous-partie d'elle, commeproducts = d['yml_catalog']['shop5']['something']
.