2013-03-26 2 views
-1

Je veux itérer les données et que les connexions téléchargement mais je reçois cette erreur:TypeError: indices de chaîne doivent être des entiers et ValueError

print elem["login"] 
TypeError: string indices must be integers, not str 

Mon code:

import requests 
import json 
import csv 
import urllib 

def printContents(path): 
    filein = open(path, 'r') 
    instr = filein.read() 
    filein.close() 
printContents("top_story_2012.txt") 
appkey = "...." 
url= "http://a.wykop.pl/ludzie/followers/" 
wykopff = open("top_story_2012.txt", 'r') 
names = [line.strip() for line in wykopff.readlines()] 
for i in names: 
    p = urllib.urlopen(url + i + "/appkey/" + appkey) 
    wykops = p.read() 
    read = json.loads(wykops) 
    for elem in wykops: 
     print elem["login"] 

J'ai essayé de changer « login » à un entier:

print elem[int("login")] 

Je ne sais pas si c'est la façon de le faire, mais il ne fonctionne toujours pas et je reçois cet e rror:

ValueError: invalid literal for int() with base 10: 'login' 

Le contenu que je suis en train de itérer ressemble à ceci:

{"login":"Josif6969","email":"a9a4525e207fcba3ac0fc221246439a3:3670009297","public_email":"","name":"","www":"","jabber":"","gg":"","city":"","about":"Hobby: Obserwator.","author_group":1,"links_added":82,"links_published":4,"comments":132,"rank":0,"followers":  
+0

Ne devriez-vous pas faire «pour elem en lecture»? –

Répondre

0

Vous voulez faire une boucle sur read, la structure JSON décodé, au lieu:

wykops = p.read() 
read = json.loads(wykops) 
for elem in read: 
    print elem["login"] 

ou , en le simplifiant pour utiliser json.load() à la place:

for elem in json.load(p): 
    print elem["login"] 

Cela suppose que les données de l'json.load() appel est une liste bien, je pense que vous vouliez simplement de traiter le résultat comme un dictionnaire à la place:

data = json.load(p): 
print data["login"] 

Il semble (des commentaires) comme si certains des réponses renvoient une liste à la place. Essayez ceci pour comprendre ce qui se passe:

data = json.load(p): 
try: 
    print data["login"] 
except TypeError: 
    # not a dictionary, so what is it *then*? 
    print "Not a dictionary:", data 

Votre code a été mise en boucle sur la chaîne de données JSON au lieu, caractère par caractère, si vous essayez d'appliquer ["login"] à une chaîne de python:

>>> 'somestring'["login"] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers, not str 
+0

Oui vrai, je dois faire une boucle de lecture mais je reçois toujours: TypeError: les index de chaîne doivent être des entiers – user2015906

+0

@ user2015906: Essayez la deuxième suggestion; Si 'read' est un dictionnaire, le fait de le faire en boucle vous donne les * clés * du dictionnaire, et' elem' est alors toujours une chaîne. –

+0

@ user2015906: utilise 'read ['login']', * no * boucle. Ou remplacez ce que vous venez de mettre dans votre commentaire avec mon * second * exemple ('data = json.load (p); print data ['login']') qui fait la même chose en moins de lignes. –

Questions connexes