Je joue à la fois avec l'apprentissage de python et j'essaie d'obtenir des problèmes de github sous une forme lisible. Utilisation des conseils sur Comment puis-je convertir JSON en CSV? Je suis venu avec ceci:
import json
import csv
f=open('issues.json')
data = json.load(f)
f.close()
f=open("issues.csv","wb+")
csv_file=csv.writer(f)
csv_file.writerow(["gravatar_id","position","number","votes","created_at","comments","body","title","updated_at","html_url","user","labels","state"])
for item in data:
csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])
Où "issues.json" est le fichier json contenant mes problèmes github. Quand j'essaye de faire ça, je reçois
File "foo.py", line 14, in <module>
csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])
TypeError: string indices must be integers
Qu'est-ce que j'oublie ici? Quels sont les "indices de chaîne"? Je suis sûr qu'une fois que cela fonctionnera, j'aurai plus de problèmes, mais pour l'instant, j'aimerais simplement que cela fonctionne!
Quand je modifie la for
déclaration pour simplement
for item in data:
print item
ce que j'obtiens c'est ... "des problèmes" - donc je fais quelque chose de plus fondamentalement erroné. Voici un peu de mon json:
{"issues":[{"gravatar_id":"44230311a3dcd684b6c5f81bf2ec9f60","position":2.0,"number":263,"votes":0,"created_at":"2010/09/17 16:06:50 -0700","comments":11,"body":"Add missing paging (Older>>) links...
quand j'imprime, data
on dirait que ça devient très bizarre:
{u'issues': [{u'body': u'Add missing paging (Older>>) lin...
print repr(data)
ouimport pprint; pprint.pprint(data)
Réponses:
item
est très probablement une chaîne dans votre code; les indices de chaîne sont ceux entre crochets, par exemplegravatar_id
. Je vérifierais donc d'abord votredata
variable pour voir ce que vous y avez reçu; Je suppose quedata
c'est une liste de chaînes (ou au moins une liste contenant au moins une chaîne) alors que ce devrait être une liste de dictionnaires.la source
La variable
item
est une chaîne. Un index ressemble à ceci:L'exemple ci-dessus utilise le
0
index de la chaîne pour faire référence au premier caractère.Les chaînes ne peuvent pas avoir d'index de chaînes (comme les dictionnaires). Donc ça ne marchera pas:
la source
data
est undict
objet. Donc, parcourez-le comme ceci:Python 2
Python 3
la source
TypeError for Slice Notation
str[a:b]
tl; dr: utilisez deux points
:
au lieu d'une virgule entre les deux indicesa
etb
dansstr[a:b]
Lorsque vous travaillez avec des chaînes et une notation de tranche (une opération de séquence courante ), il peut arriver que a
TypeError
soit élevé, soulignant que les indices doivent être des entiers, même s'ils le sont évidemment.Exemple
Nous avons évidemment passé deux entiers pour les indices à la notation de tranche, non? Alors quel est le problème ici?
Cette erreur peut être très frustrante - en particulier au début de l'apprentissage de Python - car le message d'erreur est un peu trompeur.
Explication
Nous avons implicitement passé un tuple de deux entiers (0 et 5) à la notation de tranche lorsque nous avons appelé
my_string[0,5]
parce que0,5
(même sans les parenthèses) correspond au même tuple que ce(0,5)
serait le cas.Une virgule
,
suffit en fait à Python pour évaluer quelque chose en tant que tuple:Donc, ce que nous avons fait là-bas, cette fois explicitement:
Maintenant, au moins, le message d'erreur est logique.
Solution
Nous devons remplacer la virgule
,
par deux points:
pour séparer correctement les deux entiers:Un message d'erreur plus clair et plus utile aurait pu être quelque chose comme:
Un bon message d'erreur indique directement à l'utilisateur ce qu'il a fait de mal et il aurait été plus évident de savoir comment résoudre le problème.
[Donc, la prochaine fois que vous vous retrouvez responsable de la rédaction d'un message de description d'erreur, pensez à cet exemple et ajoutez la raison ou d'autres informations utiles au message d'erreur pour que vous et peut-être d'autres personnes compreniez ce qui s'est passé.]
Leçons apprises
:
pour séparer ses indices (et la plage de pas, par exemplestr[from:to:step]
),
(par exemplet = 1,
)Bravo et bonne programmation winklerrr
[Je sais que cette question a déjà été répondue et ce n'était pas exactement la question posée par le démarreur de fil, mais je suis venu ici en raison du problème ci-dessus qui conduit au même message d'erreur. Au moins, il m'a fallu un certain temps pour trouver cette petite faute de frappe.
J'espère donc que cela aidera quelqu'un d'autre qui est tombé sur la même erreur et leur fait gagner du temps en trouvant cette minuscule erreur.]
la source
J'ai eu un problème similaire avec Pandas, vous devez utiliser la fonction iterrows () pour parcourir une documentation Pandas de jeu de données Pandas pour iterrows
notez que vous devez gérer l'index dans l'ensemble de données qui est également renvoyé par la fonction.
la source
Cela peut se produire si une virgule est manquante. Je suis tombé dessus quand j'ai eu une liste de deux tuples, dont chacun consistait en une chaîne en première position et une liste en deuxième. J'ai omis par erreur la virgule après le premier composant d'un tuple dans un cas, et l'interprète a pensé que j'essayais d'indexer le premier composant.
la source