2017-12-27 14 views
0

ich ein Python-Skript haben, die JSON in eine Datei mit Inhalt schreibt, der wie folgt aussieht:Unicode Problem versucht JSON-Datei zu verarbeiten

{ 
    "album": "Night Hawk", 
    "album_artist": "Coleman Hawkins with Eddie \u201cLockjaw\u201d Davis", 
    "artist": "Coleman Hawkins with Eddie \u201cLockjaw\u201d Davis", 
    "bitrate": 744, 
    ... 
} 

Die Datei auf den Server und verarbeitet mit diesem hochgeladen:

with open(settings.JSON_UPLOAD_DIRECTORY + f.name, 'wb+') as destination: 
    for chunk in f.chunks(): 
     destination.write(chunk) 

Dies funktioniert ohne Fehler auf meinem MacOS-Entwicklungsserver. Es hat bis jetzt auch mehrere Tausend Dateien auf meinem Deployment Server verarbeitet. Mit einem Mal erhalte ich diese Fehlermeldung:

22.  with open(settings.JSON_UPLOAD_DIRECTORY + f.name, 'wb+') as destination: 

Exception Value: 'ascii' codec can't encode character '\u201c' in position 81: ordinal not in range(128) 

ich andere Beiträge über das hier gelesen habe, ohne zu einem Verständnis zu kommen, was ich falsch mache. Ich führe Python3.6. Meine Frage ist, muss ich die Anweisung anpassen, die die Datei im Speicher zum Schreiben öffnet, oder gibt es ein Problem mit der Codierung der JSON-Datei selbst.

+0

Was ist 'f'? Das std-lib 'json'-Modul hat keine Methode' chunks', soweit ich das sehen kann. – lenz

+0

'json.dump' und Freunde arbeiten' str' Daten, so dass Sie Ausgabedateien im Textmodus ("wt") öffnen müssen. Außerdem hat 'json.dump' einen Parameter' sure_ascii', der hilfreich sein kann. – lenz

+0

@lenz 'f' ist die Variable, die ich für die "im Speicher" -Datei verwendet habe, die ich auf die Festplatte schreibe. Ich sollte das wahrscheinlich aus Gründen der Klarheit ändern. –

Antwort

0

Ich fand Inspiration in diesem other answer. Vielleicht wird es helfen? Ich glaube, die Idee ist eine konsistente Codierung beim Schreiben und Lesen der Datei:

Wie Sie sehen können, nahm ich mir die Freiheit, eine Reihe von mehr "problematischen" Zeichen in der JSON-Zeichenfolge (das "Album" -Attribut) hinzuzufügen

)
json_str = """{ 
    "album": "Ñíght Håwk 你好", 
    "album_artist": "Coleman Hawkins with Eddie \u201cLockjaw\u201d Davis", 
    "artist": "Coleman Hawkins with Eddie \u201cLockjaw\u201d Davis", 
    "bitrate": 744 
}""" 


import json 
import tempfile 
import os 

print(json.loads(json_str)) # Just double checking 
path = os.path.join(tempfile.gettempdir(), 'foo.txt') 

with open(path, 'w+', encoding='utf-8') as destination: 
    # The encoding= is the important part 
    destination.write(json_str) 

with open(path, 'r+', encoding='utf-8') as source: 
    # The encoding= is the important part 
    print(json.loads(source.read())) 

Dies scheint für die Ausgabe eines ordnungsgemäß analysiert Wörterbuch:

{'album_artist': 'Coleman Hawkins with Eddie “Lockjaw” Davis', 'artist': 'Coleman Hawkins with Eddie “Lockjaw” Davis', 'album': 'Ñíght Håwk 你好', 'bitrate': 744} 
path=/tmp/foo.txt 
{'album_artist': 'Coleman Hawkins with Eddie “Lockjaw” Davis', 'artist': 'Coleman Hawkins with Eddie “Lockjaw” Davis', 'album': 'Ñíght Håwk 你好', 'bitrate': 744} 

jedoch dieser Ausgang hängt auch von der Konfiguration des Terminals, damit ich nicht zu 100% sicher bin, wird es in Ihrem Fall zu arbeiten. Ich benutze Python 3.5.1 Für Python 2.6.x sollten Sie die io Bibliothek verwenden

+1

Es stellt sich heraus, dass das Problem nicht mit dem Inhalt der JSON-Datei, sondern mit den Zeichen im Dateinamen, den ich hochlade, zusammenhängt. Ich werde sehen, was ich als nächstes tun kann. –

+0

@DanielJewett Wenn das Problem mit dieser Antwort nichts zu tun hat, warum haben Sie es akzeptiert? Sie sollten Ihre Frage aktualisieren oder vielleicht sogar durch eine neue ersetzen. – lenz

Verwandte Themen