2015-04-07 5 views
0

Je collectionne les tweets en utilisant la bibliothèque Twitter Python. Je ne peux pas me permettre de combiner d'abord tous les dictionnaires dans une liste, puis de les sauvegarder dans un fichier à cause de problèmes de mémoire. Par conséquent, je veux conserver les dictionnaires sur le disque à chaque itération, disons après avoir rassemblé tous les 1000 dictionnaires. Y a-t-il un moyen de s'y prendre?Comment JSON vider plusieurs dictionnaires sur le disque sans les combiner dans une liste?

Si je largue les dictionnaires directement sans les mettre dans une liste, je reçois l'erreur suivante lors de la récupération du JSON du fichier:

File "read_json.py", line 6, in <module> 
jline = json.loads(line,"utf-8") 
File "/usr/lib/python2.7/json/__init__.py", line 351, in loads 
return cls(encoding=encoding, **kw).decode(s) 
File "/usr/lib/python2.7/json/decoder.py", line 369, in decode 
raise ValueError(errmsg("Extra data", s, end, len(s))) 
ValueError: Extra data: line 1 column 454154 - line 1 column 4100740 (char 454153 - 4100739) 

Après être passé par des questions sur Stackoverflow qui traitent ces erreurs, je compris que l'on devrait combiner les dictionnaires dans un objet semblable à une liste et ensuite vider - quelque chose que je ne peux pas faire.

Répondre

2

Vous pouvez sortir la liste manuellement sans la construire en python, écrire un '[' puis diffuser les dicts (séparés par un ','), quand vous voulez fermer le fichier, écrire un ']' . Ensuite, vous devriez être en mesure de le charger à nouveau, e, g .:

>>> from json import loads, dumps 
>>> a = {'a':1, 'b':2} 
>>> b = {'c':3, 'd':4} 
>>> loads("[{},{}]".format(dumps(a), dumps(b))) 
[{'a': 1, 'b': 2}, {'c': 3, 'd': 4}] 
+0

Prenant la queue de votre part, je l'ai fait d'une manière légèrement différente: '= ouvert fsort (nom de fichier, « a ») fout.write ("[") tweets = getTweetsFromAPI() = maxid getMaxId (tweets) json.dump (tweets, fout) tandis que 1: tweets = getTweetsFromAPI (max_id = maxid) fout.write (», ") json.dump (tweets, fout) fout.write ("] ") fout.close()' anks une tonne! –