Objet JSON doit être str, pas 'octets'
À l'aide de Python 3.5.1, j'ai tiré dans un fichier texte où chaque ligne est en JSON forme:
{"a":"windows", "b":"escalier"...}
import json
path = 'folder/data.txt'
records=[json.loads(line) for line in open(path,'rb')]
Mais j'ai reçu le message d'erreur:
the JSON object must be str, not 'bytes'
Je n'ai pas de problème d'impression de la première ligne du fichier, donc je suis rassuré que le chemin d'accès du fichier est correct.
- Peut-être se débarrasser de la " b " dans votre
open
appel? docs.python.org/2/library/functions.html#open dit qui va charger le fichier au format binaire, qui peut être pourquoi il n'est pas être pris comme une chaîne de caractères. - Si vous prenez juste une ligne du fichier, vous pouvez le charger en json? Comme
json.loads(file.readlines()[0])
- votre suggestion résout mon problème. J'ai aussi appris que le passage
encoding='utf-8'
directement dans leopen
appel fonctionne ainsi. Je vous remercie pour votre commentaire.
Vous devez vous connecter pour publier un commentaire.
Ouvrir le fichier en mode texte, pas en mode binaire (éventuellement explicitement en passant
encoding='utf-8'
à remplacer le système par défaut, depuis JSON est généralement stocké en tant que UTF-8). Lejson
module ne prendstr
d'entrée; la lecture à partir d'un fichier ouvert en mode binaire retournebytes
objets:Essayer:
dossiers=[json.charges(ligne.decode()) pour la ligne open(path,'rb')]
Vous ne voulez pas spécifier "rb", puisque la représentation binaire du fichier n'est pas lisible par le module JSON. Il est probable que vous voulez "utf-8" de codage et de "lire". EDIT: au départ, j'avais dit que ces deux sont des défauts, mais il a été porté à mon attention que de nombreux OS ont différentes encodage par défaut et que Python utilise le système de réglage par défaut dans open(). Je voudrais donc vous recommandons de prévoir expressément que la configuration de l'encodage comme "utf-8".
json prend en charge le chargement à partir d'un fichier ouvert avec "json.charge" au lieu de "json.de charges", qui charge à partir d'une chaîne, de sorte que nous pouvons sauter la lecture en tant que texte et allez à droite en JSON. Je ne pense pas que vous aurez envie de "charges" des lignes individuelles, puisque ce ne sera probablement pas en JSON valide.
encoding
, il est déterminé dynamiquement à partir de la plateforme dépendante des paramètres à l'aidelocale.getpreferredencoding(False)
. Si vous connaissez l'entrée est de l'UTF-8, le dire explicitement. De même, si quelqu'un a écrit JSON blobs un-par-ligne, vous ne pouvez pas charger tout le fichier à la fois, parce que l'ensemble du fichier pris ensemble n'est pas valide JSON, les lignes sont seulement juridique, JSON dans l'isolement. Aussi,json.load
appelle justefile.read()
et passe àloads
, donc c'est ni mieux ni pire queloads
. Aussi, Py3print
besoins des parens.