2016-04-08 9 views
0

nur versucht, diese JSON-Datei zu laden (mit Nicht-ASCII-Zeichen) als Python-Wörterbuch mit Unicode-Codierung, aber immer noch diesen Fehler:Python 3: JSON-Datei lädt mit Nicht-ASCII-Zeichen

Rückkehr codecs.ascii_decode (Eingang, self.errors) [0]

UnicodeDecodeError: ordinal nicht im Bereich (128)

JSON Datei content = "Tooltip":: { 'ASCII' Codec nicht byte 0xC3 in Position 90 dekodieren "dxPivotGrid-sortRowBySummary": "Sort" {0} "byThisRow",}

import sys 
import json 

data = [] 
with open('/Users/myvb/Desktop/Automation/pt-PT.json') as f: 
    for line in f: 
     data.append(json.loads(line.encode('utf-8','replace'))) 
+0

'json.loads' als eine Argumentcodierung. Was ist der wirkliche Inhalt der Datei 'pt-PT.json'? Gibt es Zeilen mit gültigen JSON-Daten oder eine lange JSON-Datei? Im letzteren Fall wäre es besser, direkt als Datei, nicht zeilenweise zu laden. –

+0

Die Zeichenfolge, die Sie als JSON-Dateiinhalt anzeigen, ist kein gültiger JSON, sondern nur ein Fragment eines größeren Objekts. –

+0

Versuchte Laden als eine Datei auch, aber das gleiche Problem und Fehler wird angezeigt – min2bro

Antwort

0

Ich hatte das gleiche Problem, was für mich gearbeitet wurde einen regulären Ausdruck erstellen, und jede Zeile aus dem JSON-Datei-Analyse:

REGEXP = '[^A-Za-z0-9\'\:\.\;\-\?\!]+' 
new_file_line = re.sub(REGEXP, ' ', old_file_line).strip() 
+0

sein kann Dies entfernt alle nicht-englischen Zeichen, die wahrscheinlich nicht was OP will. – tdelaney

0

eine Datei mit Inhalt ähnlich wie bei Ihnen Nachdem ich die Datei lesen kann in einem einfachen Schuss:

>>> import json 
>>> fname = "data.json" 
>>> with open(fname) as f: 
...  data = json.load(f) 
... 
>>> data 
{'tooltip': {'navbar': 'Operações de grupo'}} 
+0

nach vielen Analysen, die ich fand, gibt es diesen Fehler wegen dieser Daten in der JSON-Datei: – min2bro

+0

"dxPivotGrid-sortRowBySummary": "Sortieren" {0} \ "byThisRow", – min2bro

0

Sie müssen nicht jede Zeile lesen. Sie haben zwei Möglichkeiten:

import sys 
import json 

data = [] 
with open('/Users/myvb/Desktop/Automation/pt-PT.json') as f: 
    data.append(json.load(f)) 

Oder Sie können alle Linien laden und sie dem json-Modul übergeben:

import sys 
import json 

data = [] 
with open('/Users/myvb/Desktop/Automation/pt-PT.json') as f: 
    data.append(json.loads(''.join(f.readlines()))) 

Offensichtlich ist der erste Vorschlag ist der beste.

2

Sie haben mehrere Probleme so nah wie ich sagen kann. Erstens, ist die Dateicodierung. Wenn Sie eine Datei öffnen, ohne eine Kodierung anzugeben, wird die Datei mit allem geöffnet, was auch immer sys.getfilesystemencoding() ist. Da dies variieren kann (besonders auf Windows-Rechnern) ist es eine gute Idee, für die meisten JSON-Dateien explizit encoding="utf-8" zu verwenden. Aufgrund Ihrer Fehlermeldung vermute ich, dass die Datei mit einer ascii Codierung geöffnet wurde.

Als nächstes wird die Datei von utf-8 in Python-Strings decodiert, wie sie vom Dateisystemobjekt gelesen werden. Die utf-8 Zeile wurde bereits zu einer Zeichenkette dekodiert und ist bereits bereit für json zu lesen. Wenn Sie line.encode('utf-8','replace') tun, codieren Sie die Zeile wieder in ein bytes Objekt, das die JSON loads (das heißt, "Zeichenfolge laden") nicht verarbeiten kann.

Schließlich ist "tooltip":{ "navbar":"Operações de grupo"} nicht gültig json, aber es sieht aus wie eine Zeile einer hübsch gedruckten JSON-Datei, die ein einzelnes JSON-Objekt enthält. Meine Vermutung ist, dass Sie die gesamte Datei als 1 Json-Objekt lesen sollten.

es Putting alles zusammen bekommen Sie:

import json 

with open('/Users/myvb/Desktop/Automation/pt-PT.json', encoding="utf-8") as f: 
    data = json.load(f) 

Von seinen Namen, seine möglich, dass diese Datei als Windows-Portugiesisch-Codepage codiert ist. Wenn dies der Fall ist, könnte die Codierung "cp860" besser funktionieren.

+0

es ist nicht wegen der portugiesischen Inhalte sondern aufgrund JSON-Datei content = "tooltip": {"dxPivotGrid-sortRowBySummary": "Sortieren \" {0} \ "byThisRow",} – min2bro

+0

Ich sehe, dass Sie die Zeichenfolge, die Probleme in Ihrer Frage verursacht, von einer mit nicht-ASCII-Zeichen geändert haben . Die neue Zeichenfolge enthält kein Codierungsbyte 0xc3 utf-8, so dass ich nicht sehe, wie es den Fehler "Kann Byte 0xc3 nicht decodieren" erzeugen kann. Unabhängig davon ist diese Zeichenfolge kein gültiger JSON, sieht aber wie ein Fragment eines gültigen JSON aus. Sagen Sie, dass die gesamte Datei nur diese eine Zeile enthält? – tdelaney