Pythons csv
Paket ist sehr nützlich. Es macht den mühsamen Fluchtprozess richtig. Besonders nützlich für die Verarbeitung von Dateien, die als Excel-Dateien gesendet werden. Schließlich können Sie Excel CSV mit "dialect =" excel "" richtig lesen.
Wenn Japanisch involviert ist, wird das Problem jedoch schnell problematisch. Was ist das Wesentliche des Problems? Zunächst ist Folgendes über den Umgang mit TSV in Excel bekannt.
--Excel tsv export is utf-16 (mit Stückliste) --Excel kann tsv von utf-16 mit Stückliste direkt lesen (für die Trennung zwischen Kommas ist ein Assistent erforderlich). --csv (durch Kommas getrennt) kann ausgegeben und gelesen werden, wird jedoch nicht empfohlen (später beschrieben).
Daraus können Sie ersehen, dass es am besten ist, mit utf-16-Dateien mit Stückliste zu arbeiten. Der beste Weg, dies zu handhaben, ist die Verwendung des io
-Pakets.
with io.open(path, encoding='utf-16') as f:
...
Ich habe es kurz geschrieben, aber es ist wirklich wichtig, das "io" -Paket zu verwenden. utf-16 ist ein ziemlich unhandliches Format. Erstens gibt es Stückliste. Wenn in diesem Zustand "cr + lf" ausgeführt wird, wird "\ 0" in Byteeinheiten eingefügt. Wenn Sie also normalerweise open () verwenden, verhält es sich wie ein Rätsel.
Jetzt tritt hier das Problem auf. Bei Verwendung der Python2-Serie unterstützt das Paket "csv" kein "Unicode". Daher kann es nicht gelesen werden, wenn es mit der obigen Methode geöffnet wird. Wenn Sie bei gutem Wetter "offen" verwenden, ist das Lesen aus den oben genannten Gründen schwierig. Früher habe ich mit csv von shift-jis exportiert, aber Excel scheint intern Unicode zu sein, und manchmal ist der Trübungspunkt ein anderes Zeichen und befindet sich zu diesem Zeitpunkt in einem nicht normalisierten Zustand Als ich es ausgab, verschwanden alle trüben Punkte. Daher empfehle ich diese Methode auch nicht.
Wie man Unicode mit "csv" liest, wird in Ende des Handbuchs beschrieben. Die richtige Antwort besteht darin, den "Unicode" -Stream einmal in utf-8 zu codieren, ihn mit dem "csv" -Paket in diesem Zustand zu lesen, ihn zu teilen und utf-8 erneut zu decodieren. Das gleiche gilt beim Schreiben. Setzen Sie einfach "Unicode" auf "utf-8", schreiben Sie in "StringIO" und konvertieren Sie es erneut in "Unicode", bevor Sie es in eine Datei ausspucken. Es war zweimal überwältigend problematisch, aber ich hatte viele Jahre mit Excel zu kämpfen und bekam schließlich die stabilste Ausgabe. In Python3 unterstützt das "csv" -Paket übrigens "str" ("Unicode" in 2), sodass Sie es mit "io" öffnen und normal verarbeiten können.
Es wäre dunkel, wenn ich diese Prozesse jedes Mal schreiben würde, also habe ich daraus eine Bibliothek gemacht.
https://github.com/unnonouno/excelcsv
Vielleicht werden alle oben genannten Probleme vermieden.
Das ist alles, aber lassen Sie uns überprüfen, was Sie nicht tun sollten und warum.
.encode ('utf-16')
erzeugt eine utf-16-Zeichenfolge mit Stückliste. Dies ist der entscheidende Unterschied zu anderen Kodierungen.
>>> u'a'.encode('utf-16')
'\xff\xfea\x00'
Wenn Sie einen Code wie "[x.encode ('utf-16') für x in Zeile]" schreiben, wird eine mysteriöse Zeichenfolge mit Stückliste generiert. Dieser Ansatz ist nutzlos. Stückliste sollte nur am Anfang der Datei enthalten sein. Der beste Weg, dies zu vermeiden, besteht darin, es im Prinzip mit "Unicode" zu behandeln und es im Dateiausgabeteil zu steuern. Es ist das "io" -Paket, das dies tut, und Sie sollten es nicht selbst mit dem regulären "open" codieren. Eine andere Problemumgehung besteht darin, mit utf-8 in "StringIO" auszugeben, das Ganze vor dem Schreiben in die Datei in "Unicode" zu konvertieren und es dann wieder in utf-16 zu konvertieren. Es ist jedoch sauberer, "io" zu verwenden.
utf-16 bedeutet, dass das Zeilenvorschubzeichen und das Tabulatorzeichen, die Sie analysieren möchten, ebenfalls in 2 Bytes geschrieben sind. Wenn Sie das Python2-Paket "csv", das in 1-Byte-Einheiten verarbeitet wird, verarbeiten lassen, bleiben unnötige "\ 0" -Zeichen übrig. Dieser Ansatz kann nur mit utf-8, shift-jis usw. verwendet werden, bei denen die Ascii-Zeichen intakt bleiben.
Excel scheint die Daten intern in Unicode zu haben. Am schlimmsten ist jedoch, dass die Trübung als separates Zeichen gespeichert wird. Wenn Sie in diesem Zustand mit Shift-Jis exportieren, verschwindet die gesamte Trübung. Ich wünschte, ich könnte es normalisieren. Daher ist das Exportieren aus Excel eine utf-16-Textauswahl. Es ist umständlich zu handhaben, aber es kann nicht geholfen werden.
Recommended Posts