2009-03-02 7 views
12

Immer wenn ich versuche, eine .csv-Datei mit dem Python-Befehl fread = open('input.csv', 'r') zu öffnen, öffnet es immer die Datei mit Leerzeichen zwischen jedem einzelnen Zeichen. Ich vermute, dass etwas mit der Textdatei nicht stimmt, weil ich andere Textdateien mit demselben Befehl öffnen kann und sie korrekt geladen werden. Weiß jemand, warum eine Textdatei in Python so geladen würde?Python öffnet Textdatei mit einem Leerzeichen zwischen jedem Zeichen

Danke.

aktualisieren

Ok, ich habe es mit Hilfe von Jarret Hardie der Post

Dies ist der Code, den ich die Datei zu konvertieren verwendet

fread = open('input.csv', 'rb').read() 
mytext = fread.decode('utf-16') 
mytext = mytext.encode('ascii', 'ignore') 
fwrite = open('input-ascii.csv', 'wb') 
fwrite.write(mytext) 

Dank ascii!

Antwort

14

Der Post von rekursiv ist wahrscheinlich richtig ... der Inhalt der Datei wird wahrscheinlich mit einem Multi-Byte-Zeichensatz codiert. Wenn dies tatsächlich der Fall ist, können Sie die Datei wahrscheinlich in Python selbst lesen, ohne sie zuerst außerhalb von Python konvertieren zu müssen.

Versuchen Sie so etwas wie:

fread = open('input.csv', 'rb').read() 
mytext = fread.decode('utf-16') 

Die 'b' Flag sorgt für die Datei als binäre Daten gelesen werden. Sie müssen die ursprüngliche Codierung kennen (oder erraten) ... In diesem Beispiel habe ich utf-16, aber YMMV verwendet. Dadurch wird die Datei in Unicode konvertiert. Wenn Sie wirklich eine Datei mit Multi-Byte-Zeichen haben, rate ich nicht dazu, sie in ASCII zu konvertieren, da Sie dadurch möglicherweise viele Zeichen verlieren.

EDIT: Danke für das Hochladen der Datei. Es gibt zwei Bytes an der Vorderseite der Datei, die anzeigen, dass es tatsächlich einen breiten Zeichensatz verwendet. Wenn Sie neugierig sind, öffnen Sie die Datei in einem Hex-Editor, wie einige vorgeschlagen haben ... Sie werden etwas in der Textversion wie 'I.D. |.' (etc). Der Punkt ist das zusätzliche Byte für jedes Zeichen.

Der obige Codeausschnitt scheint auf meinem Rechner mit dieser Datei zu funktionieren.

0

Es ist mir nie aufgefallen, aber wie truppo sagte, muss etwas mit der Datei nicht stimmen.

Versuchen Sie, die Datei in Excel/BrOffice Calc zu öffnen und als Datei erneut als Csv zu speichern.

Wenn das Problem weiterhin besteht, versuchen Sie eine Teilmenge der Daten: Faust 10/Letzte 10/Zwischen 10 Zeilen der Datei.

1

Ist nicht csv eine einfache txt-Datei mit Werten durch Komma getrennt. Versuchen Sie einfach, es mit einem Texteditor zu öffnen, um zu sehen, ob die Datei korrekt erstellt wurde.

+0

auch nicht analysieren, es ist eine Textdatei und richtig formatiert mit | Zeichen statt Kommas, aber das Problem ist tatsächlich, bevor ich jemals versuche, es in den CSV-Reader zu lesen. – wlindner

0

Sie können auch die fragliche Datei auf eine Website wie http://drop.io/ hochladen und uns einen Link geben.

+0

http://drop.io/nbcacm5 – wlindner

7

Die Datei ist in einer Unicode-Codierung codiert, aber Sie lesen sie als ASCII. Versuchen Sie, die Datei in ascii zu konvertieren, bevor Sie sie in Python verwenden.

+0

Ja, ich denke, es ist in Unicode, gibt es eine Möglichkeit, die Datei in Python zu öffnen, konvertieren Sie die Datei in ASCII, schreiben Sie die Datei, dann öffnen Sie es erneut, um es als CSV zu laden? – wlindner

0

Ok, ich habe es mit Hilfe von Jarret Hardie der Post

dies ist der Code, den ich verwendet, um die Datei zu konvertieren

fread = open('input.csv', 'rb').read() 
mytext = fread.decode('utf-16') 
mytext = mytext.encode('ascii', 'ignore') 
fwrite = open('input-ascii.csv', 'wb') 
fwrite.write(mytext) 

Dank ascii!

0

Öffnen Sie die Datei im Binärmodus, 'rb'. Überprüfen Sie es in einem HEX-Editor, und prüfen Sie, ob das Null-Padding '00' ist. Öffnen Sie die Datei in etwas wie Scintilla Text Editor, um die Zeichen in der Datei zu überprüfen.

+0

+1 für die Erwähnung von Scintilla :) –

1

Um eine codierte Datei zu lesen, können Sie einfach open durch codecs.open ersetzen.

fread = codecs.open('input.csv', 'r', 'utf-16') 
0

Hier ist die schnelle und einfache Möglichkeit, besonders wenn Python wird die Eingabe korrekt

sed 's/ \(.\)/\1/g' 
Verwandte Themen