2012-04-19 2 views
18

Quindi voglio convertire un semplice file di testo delimitato da tabulazioni in un file csv. Se converto il file txt in una stringa usando string.split ('\ n') ottengo una lista con ogni elemento della lista come una stringa con '\ t' tra ogni colonna. Stavo pensando che potrei semplicemente sostituire '\ t' con una virgola ma non tratterò la stringa all'interno della lista come stringa e mi permetterò di usare string.replace. Ecco l'inizio del mio codice che ha ancora bisogno di un modo per analizzare la scheda "\ t".Converti file txt delimitato da tabulazioni in un file csv usando 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) 

risposta

35

csv supporta file delimitati da tabulazioni. Alimentare il 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 Si sono Presumendo che il PO è in Python 2.x; in quel caso il file di input dovrebbe essere aperto con la modalità 'rb'. Inoltre, non garantire che almeno il file di output sia chiuso, preferibilmente entrambi i file. –

+3

bici da slitta. Entrambi i file vengono chiusi non appena termina lo script. Che è .. immediatamente. +1. – ch3ka

+1

@JohnMachin Non ho presunto nulla. Ho cambiato il meno possibile per mostrare come convertire un file. 'with' non è necessario se il programma sta per terminare immediatamente - il file verrà chiuso. Ho aggiunto un commento per indicare che occorre prestare attenzione se si tratta di un programma a esecuzione prolungata. – agf

2

Perché si deve sempre utilizzare la modalità 'rb' durante la lettura di file con il modulo csv:

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. 

Cosa c'è nel file di esempio: qualsiasi vecchio spazzatura, compresi i caratteri di controllo ottenuti da l'estrazione di macchie o qualsiasi altra cosa da un database, o l'uso sconsiderato della funzione CHAR in formule di Excel, o ...

>>> 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 segue CP/M, MS-DOS e Windows quando legge i file in modalità testo: \r\n viene riconosciuto come separatore di riga e viene visualizzato come \n e \x1a ovvero Ctrl-Z è riconosciuto come FINE DI FILE pennarello.

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

csv con un file aperto con 'rb' funziona come previsto:

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

ma modalità testo non lo fa:

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

Hai un riferimento a python.org per il comportamento Ctrl-z? Non ne vedo alcuna menzione. – agf

+1

@agf: No. È una conseguenza di CPython 2.X delegare la responsabilità per decidere cosa fare alla libreria 'C'' stdio' del compilatore di destinazione. –