2017-04-12 3 views
1

Ich versuche, die folgenden JSON-Daten mit Python-Code (Python V3.5.1) zu lesen, aber das Problem ist, dass Zeichendarstellung ç als ç und £ als  £. Bitte helfen Sie mir mit dem Code, der richtig lesen und schreiben von Daten in und aus der Datei, ohne das Format oder char wechselndesLesen und schreiben Unicode-Zeichen aus Json-Datei mit Python

Json Daten:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

Python-Code:

import json 
import os 

fileLoc=os.path.join(os.getcwd(),"appconfig.json") 
json_data=open(fileLoc).read() 
print(json_data) 

Ausgang:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

Antwort

0

Versuchen Sie, implizites Codieren und Decodieren zu vermeiden.

Wenn Sie open() verwenden, um Textdateien (wie JSON, aber im Gegensatz zu XML) zu lesen (oder zu schreiben), werden die Dateiinhalte mit einer Standardcodierung decodiert. Welche Standardcodierung verwendet wird, hängt von Ihrer Umgebung ab. Sie können dies mit locale.getpreferredencoding() sehen.

Nehmen wir also an, dass appconfig.json auf der Festplatte mit UTF-8 gespeichert ist, aber Ihr Gebietsschema konfiguriert ist, Latin-1 zu verwenden, dann den Buchstaben ç wird als Folge § falsch interpretiert werden. Bestätigen:

>>> 'ç'.encode('utf8').decode('latin1') 
'ç' 

Wenn dies der Fall ist, dann ist es einfach zu beheben: Geben Sie die Codierung auf open():

with open(fileLoc, 'r', encoding='utf8') as f: 
    json_data = f.read() 

Es gibt eine andere möglich (aber weniger wahrscheinlich) Erklärung: Vielleicht ist die Standard-Kodierung ist bereits UTF-8, daher werden die Daten beim Lesen aus der Datei korrekt decodiert. Der Ausdruck print() codiert dann die Daten, wiederum unter Verwendung von UTF-8, wodurch eine Sequenz von Bytes an STDOUT gesendet wird, die genau mit dem Inhalt der Datei übereinstimmt. Aber dann, Ihr Terminal (oder was auch immer Sie verwenden, um das Skript auszuführen) fehlinterpretiert die Ausgabe als Latin-1, so dass sie als verstümmelte Zeichen angezeigt werden.

Wenn letzteres der Fall ist, dann müssen Sie die Terminalkonfiguration reparieren (um UTF-8 zu akzeptieren), oder sys.stdout (mit sys.stdout = codecs.getwriter('latin-1')(sys.stdout), aber ich empfehle das nicht).

+0

Dank @lenz, ja genau das habe ich getan und jetzt funktioniert es. Mit anderen Worten, ich bin neu in Unix env. Ich denke, Source Code Build und getestet in Win-Env sind immer noch Arbeit in Unix Env ​​vorausgesetzt, dass gleiche Python-Version verwendet wird. Für Dateipfad oder Speicherort verwende ich OS-Paket wie Join (sourceLoc, Datei), hoffe mein Verständnis ist in Ordnung. Für den Windows-Pfad könnte c: \ filelocation sein und in Unix könnte/var/sp/filelocation/ jedes Dokument \ Material um Python unter UNIX hilfreich sein. – RintG

+0

@RintG Ich bin mir nicht sicher, ob ich das verstehe. Es gibt einige Dinge, die beachtet werden müssen, wenn Sie versuchen, Code zu schreiben, der über Betriebssysteme hinweg portierbar ist, und 'os.path.join' zu verwenden, um Pfade zu schreiben, ist sicherlich eine gute Wahl. Wenn Sie eine konkretere Frage zu Python unter Unix haben, stellen Sie eine separate Frage. – lenz

Verwandte Themen