Json.vidage à défaut avec "doit être unicode, pas de str' TypeError
J'ai un fichier json qui arrive à avoir une multitude de Chinois et de Japonais (et autres langues) caractères. Je suis charger dans mon python 2.7 script à l'aide de io.open
comme suit:
with io.open('multiIdName.json', encoding="utf-8") as json_data:
cards = json.load(json_data)
- Je ajouter une nouvelle propriété pour le json, toutes les bonnes. Puis-je tenter de l'écrire à un autre fichier:
with io.open("testJson.json",'w',encoding="utf-8") as outfile:
json.dump(cards, outfile, ensure_ascii=False)
C'est quand je reçois le message d'erreur TypeError: must be unicode, not str
J'ai essayé d'écrire le outfile comme un binaire (with io.open("testJson.json",'wb') as outfile:
), mais je me retrouve avec des trucs de ce:
{"multiverseid": 262906, "name": "\u00e6\u00b8\u00b8\u00e9\u009a\u00bc\u00e7\u008b\u00ae\u00e9\u00b9\u00ab", "language": "Chinese Simplified"}
Je pensais que l'ouverture et l'écriture dans le même encodage serait suffisant, ainsi que la ensure_ascii drapeau, mais clairement pas. Je veux juste préserver les personnages qui ont existé dans le fichier avant que je lance mon script, sans tourner en \u.
string
type d'objet (cards
).Ah, devrait l'ai mentionné, les cartes est un objet json:
cards = json.load(json_data)
qu'est-ce que la nouvelle propriété vous ajouter? est-il possible d'écrire un un Minimum Vérifiable Exemple?
OriginalL'auteur IronWaffleMan | 2016-03-15
Vous devez vous connecter pour publier un commentaire.
Pouvez-vous essayer le suivant?
Beaucoup 🙂 Oui. le outfile.écrire(contenu) écrit le contenu de la outfile. Alors que outfile se réfère à "testJson.json" fichier. voir plus docs.python.org/2/tutorial/inputoutput.html
Danger! Vous avez un implicite str->conversion Unicode, sans un encodage défini. En Python 2.x, l'encodage par défaut est l'ASCII, de sorte que vous obtiendrez un
UnicodeDecodeError
exception si votre JSON contient des caractères non ASCII caractèresEn fait, ce n'est toujours pas bon :/
Vous pouvez avoir 8 bits chaînes données en json, et la sortie serait toujours en pause.
OriginalL'auteur Yaron
La raison de cette erreur est complètement stupide comportement de
json.dumps
en Python 2:Ceci, couplé avec le fait que
io.open
avecencoding
ensemble n'accepteunicode
objets (qui est lui-même à droite), conduit à des problèmes.Le type de retour est entièrement dépendante, quel que soit le type de clés ou des valeurs dans le dictionnaire, si
ensure_ascii=False
, maisstr
est retourné toujours siensure_ascii=True
. Si vous pouvez accidentellement ensemble de 8 bits chaînes de dictionnaires, vous ne pouvez pas aveuglément convertir ce type de retour pourunicode
, parce que vous besoin pour définir l'encodage, probablement en UTF-8:Dans ce cas, je crois que vous pouvez utiliser le
json.dump
à écrire un ouvrir fichier binaire; toutefois, si vous avez besoin de faire quelque chose de plus compliqué avec l'objet, vous avez probablement besoin le code ci-dessus.Une solution est de mettre fin à tout cela, l'encodage/décodage de la folie par le passage à Python 3.
naah occupé maintenant, et j'ai frappé repcap aujourd'hui déjà 😀
Si j'ai réussi à convertir mon script py3, comment le codage de la gestion du changement?
OriginalL'auteur Antti Haapala
Le JSON poignées de module d'encodage et de décodage pour vous, alors vous pouvez simplement ouvrir l'entrée et la sortie des fichiers en mode binaire. Le module JSON suppose l'encodage UTF-8, mais peut être changé à l'aide de
encoding
attribut sur laload()
etdump()
méthodes.alors:
Grâce à @Antti de la Haapala, Python 2.x JSON module donne des caractères Unicode ou str, selon le contenu de l'objet.
Vous devrez ajouter un sentiment de vérifier le résultat est une Unicode avant d'écrire par le biais de
io
:UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
À partir de quelle ligne?
Êtes-vous sûr de définir le
b
mode sur les deuxopen()
appels?Yep, j'en suis sûr. Il était sur le json.vidage de la ligne.
OriginalL'auteur Alastair McCormack