2012-04-19 4 views
18

Also ich möchte eine einfache Tab-getrennte Textdatei in eine CSV-Datei konvertieren. Wenn ich die txt-Datei mit string.split ('\ n') in eine Zeichenkette umwandle, erhalte ich eine Liste mit jedem Listenelement als String mit '\ t' zwischen jeder Spalte. Ich dachte, ich könnte einfach das '\ t' durch ein Komma ersetzen, aber es wird nicht die Zeichenfolge in der Liste wie Zeichenfolge behandeln und mir erlauben, string.replace zu verwenden. Hier ist der Anfang meines Codes, der noch eine Möglichkeit benötigt, den Tab "\ t" zu parsen.Konvertieren Tabstopp-getrennte TXT-Datei in eine CSV-Datei mit Python

import csv 
import sys 

txt_file = r"mytxt.txt" 
csv_file = r"mycsv.csv" 

in_txt = open(txt_file, "r") 
out_csv = csv.writer(open(csv_file, 'wb')) 

file_string = in_txt.read() 

file_list = file_string.split('\n') 

for row in ec_file_list:  
    out_csv.writerow(row) 

Antwort

35

csv unterstützt tabulatorgetrennte Dateien. Versorgen Sie die delimiter argument to reader:

import csv 

txt_file = r"mytxt.txt" 
csv_file = r"mycsv.csv" 

# use 'with' if the program isn't going to immediately terminate 
# so you don't leave files open 
# the 'b' is necessary on Windows 
# it prevents \x1a, Ctrl-z, from ending the stream prematurely 
# and also stops Python converting to/from different line terminators 
# On other platforms, it has no effect 
in_txt = csv.reader(open(txt_file, "rb"), delimiter = '\t') 
out_csv = csv.writer(open(csv_file, 'wb')) 

out_csv.writerows(in_txt) 
+1

-1 Sie sind der Annahme, dass die OP eingeschaltet ist Python 2.x; In diesem Fall sollte die Eingabedatei mit dem Modus 'rb' geöffnet werden. Es wird auch nicht sichergestellt, dass mindestens die Ausgabedatei geschlossen ist, vorzugsweise beide Dateien. –

+3

bikeshedding. Beide Dateien werden geschlossen, sobald das Skript beendet wird. Was ist ... sofort. +1. – ch3ka

+1

@JohnMachin Ich habe nichts vermutet. Ich habe so wenig wie möglich geändert, um zu zeigen, wie man eine Datei konvertiert. 'with' ist nicht notwendig, wenn das Programm sofort beendet wird - die Datei wird geschlossen. Ich fügte einen Kommentar hinzu, um darauf hinzuweisen, dass Vorsicht geboten ist, wenn es sich um ein lang laufendes Programm handelt. – agf

2

Warum sollten Sie immer ‚rb‘ Modus verwenden, wenn Dateien mit dem csv Modul zu lesen:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 

Was in der Beispieldatei ist: alle alten Müll, einschließlich Steuerzeichen erhalten durch Extrahieren von Blobs oder was auch immer aus einer Datenbank oder unüberlegter Verwendung der CHAR Funktion in Excel-Formeln, oder ...

>>> open('demo.txt', 'rb').read() 
'h1\t"h2a\nh2b"\th3\r\nx1\t"x2a\r\nx2b"\tx3\r\ny1\ty2a\x1ay2b\ty3\r\n' 

Python folgt CP/M, MS-DOS und Windows beim Lesen von Dateien im Textmodus: \r\n wird als Zeilentrennzeichen erkannt und wird als \n und alias Ctrl-Z wird als END-OF-FILE erkannt Marker.

>>> open('demo.txt', 'r').read() 
'h1\t"h2a\nh2b"\th3\nx1\t"x2a\nx2b"\tx3\ny1\ty2a' # WHOOPS 

csv mit einer Datei mit 'rb' geöffnet wie erwartet funktioniert:

>>> import csv 
>>> list(csv.reader(open('demo.txt', 'rb'), delimiter='\t')) 
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\r\nx2b', 'x3'], ['y1', 'y2a\x1ay2b', 'y3']] 

aber Textmodus nicht:

>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t')) 
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']] 
>>> 
+0

Haben Sie eine Referenz auf python.org für das Verhalten Ctrl-z? Ich sehe keine Erwähnung davon. – agf

+1

@agf: Nein. Es ist eine Konsequenz von CPython 2.X delegiert die Verantwortung für die Entscheidung, was zu tun ist mit der 'C' 'stdio' Bibliothek des Ziel-Compilers. –

Verwandte Themen