Ich habe eine UTF-16 CSV-Datei, die ich lesen muss. Python CSV-Modul scheint UTF-16 nicht zu unterstützen.
Ich benutze Python 2.7.2. CSV-Dateien, die ich parsen muss, sind riesig, da sie mehrere GB Daten umfassen.
Antworten auf John Machin Fragen
%Vor%Ausgabe mit test.csv mit abc als Inhalt
%Vor%Ich denke, CSV-Datei wurde auf Windows-Maschine in den USA erstellt. Ich benutze Mac OS X Lion.
Wenn ich Code von phihag und test.csv mit einem Datensatz verwende.
Beispiel test.csv Inhalt verwendet. Darunter ist print repr (open ('test.csv', 'rb'). Lesen (1000)) output
%Vor%Code von phihag
%Vor%Ausgabe des obigen Codes
%Vor%erwartete Ausgabe ist
%Vor%Momentan unterstützt das csv-Modul UTF-16 nicht.
In Python 3.x erwartet csv eine Textmodus-Datei und Sie können einfach den Encoding-Parameter von open
, um eine andere Kodierung zu erzwingen:
In Python 2.x können Sie die Eingabe neu codieren:
%Vor% open
und codecs.open
erfordern, dass die Datei mit einer Stückliste beginnt. Wenn dies nicht der Fall ist (oder Sie Python 2.x verwenden), können Sie es trotzdem wie folgt in den Speicher konvertieren:
Ich würde dringend empfehlen, dass Sie Ihre Datei (en) in UTF-8 umcodieren. Unter der sehr wahrscheinlichen Bedingung, dass Sie keine Unicode-Zeichen außerhalb des BMP haben, können Sie die Tatsache nutzen, dass UTF-16 eine Codierung mit fester Länge ist, um Blöcke fester Länge aus Ihrer Eingabedatei zu lesen, ohne sich um einen blockierenden Block kümmern zu müssen Grenzen.
Schritt 1: Bestimmen Sie, welche Kodierung Sie tatsächlich haben. Untersuchen Sie die ersten paar Bytes Ihrer Datei:
print repr(open('thefile.csv', 'rb').read(100))
Vier mögliche Arten der Kodierung von u'abc'
Wenn Sie Probleme mit diesem Schritt haben, bearbeiten Sie Ihre Frage so, dass sie die Ergebnisse des obigen print repr()
Schritt 2: Hier ist ein Python 2.X recode-UTF-16 * -to-UTF-8-Skript:
%Vor%Andere Angelegenheiten:
Sie sagen, dass Ihre Dateien zu groß sind, um die gesamte Datei zu lesen, zu rekodieren und neu zu schreiben, aber Sie können sie in vi
öffnen. Bitte erläutern.
Die & lt; 85 & gt; als Ende der Aufzeichnung behandelt wird, ist ein bisschen eine Sorge. Sieht so aus, als ob 0x85
als NEL erkannt wird (C1 Steuercode, NEWLINE). Es besteht die große Wahrscheinlichkeit, dass die Daten ursprünglich in einer älteren Single-Byte-Codierung codiert wurden, wobei 0x85 eine Bedeutung hat, aber unter der falschen Annahme, dass die ursprüngliche Codierung ISO-8859-1 alias latin1 war, in UTF-16 umcodiert wurde. Woher stammt die Datei? Ein IBM Mainframe? Windows / Unix / klassischer Mac? Welches Land, welche Sprache, welche Sprache? Du denkst offensichtlich, dass das & lt; 85 & gt; ist nicht als Zeilenschaltung gedacht; Was denkst du, was es bedeutet?
Bitte senden Sie eine Kopie einer beschnittenen Datei (die einige der & lt; 85 & gt; -Sachen enthält) an sjmachin at lexicon dot net
Aktualisieren basierend auf den bereitgestellten 1-zeiligen Beispieldaten.
Das bestätigt meinen Verdacht. Lesen Sie dies . Hier ist ein Zitat:
... die C1-Steuerzeichen ... werden selten direkt verwendet, außer auf bestimmte Plattformen wie OpenVMS. Wenn sie in Dokumenten auftauchen, Webseiten, E-Mail-Nachrichten, etc., die angeblich in einem sind ISO-8859-n Codierung, beziehen sich ihre Codepositionen im Allgemeinen stattdessen auf die Charaktere an dieser Position in einem proprietären, systemspezifischen Kodierung wie Windows-1252 oder der Apple Macintosh ("MacRoman") Zeichensatz, der die für die Darstellung des C1 vorgesehenen Codes verwendet Setzen Sie mit einem einzelnen 8-Bit-Byte, um stattdessen zusätzliche Grafik bereitzustellen Zeichen
Dieser Code:
%Vor%erzeugt Folgendes (Python 2.7.2 IDLE, Windows 7):
%Vor% Was halten Sie für eine sinnvollere Interpretation von \x96
:
SPA, d. h. Beginn des geschützten Bereichs (Wird von blockorientierten Terminals verwendet.)
oder
EN DASH
?
Sieht so aus, als ob eine gründliche Analyse einer viel größeren Datenprobe gerechtfertigt ist. Gerne helfen.
Öffnen Sie einfach Ihre Datei mit codecs.open
wie in
Und arbeiten Sie mit Unicode-Strings durch Ihr Programm, wie Sie ohnehin tun sollten, wenn Sie Text verarbeiten