Python UTF-16 CSV-Reader

8

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%     
venky 07.02.2012, 14:16
quelle

4 Antworten

28

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:

%Vor%

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:

%Vor%     
phihag 07.02.2012, 14:23
quelle
4

Die Python 2.x csv Moduldokumentation Beispiel zeigt, wie mit anderen Kodierungen umgegangen wird.

    
Mark Tolonen 08.02.2012 01:48
quelle
3

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'

%Vor%

Wenn Sie Probleme mit diesem Schritt haben, bearbeiten Sie Ihre Frage so, dass sie die Ergebnisse des obigen print repr()

enthält

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.

    
John Machin 07.02.2012 20:44
quelle
-1

Öffnen Sie einfach Ihre Datei mit codecs.open wie in

%Vor%

Und arbeiten Sie mit Unicode-Strings durch Ihr Programm, wie Sie ohnehin tun sollten, wenn Sie Text verarbeiten

    
jsbueno 07.02.2012 15:04
quelle

Tags und Links