2012-04-19 102 views
18

Por lo tanto, quiero convertir un archivo de texto delimitado por tabuladores simple en un archivo csv. Si convierto el archivo txt en una cadena usando string.split ('\ n') obtengo una lista con cada elemento de la lista como una cadena con '\ t' entre cada columna. Estaba pensando que podría reemplazar el '\ t' con una coma, pero no tratará la cadena dentro de la lista como una cadena y me permitirá usar string.replace. Aquí está el inicio de mi código que todavía necesita una forma de analizar la pestaña "\ t".Convertir archivo txt delimitado por tabuladores en un archivo csv utilizando 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) 

Respuesta

35

csv soporta archivos delimitados. Suministrar el 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 está suponiendo que el PO está en Python 2.x; en ese caso, el archivo de entrada se debe abrir con el modo 'rb'. Además, no garantiza que al menos el archivo de salida esté cerrado, preferiblemente ambos archivos. –

+3

bikeshedding. Ambos archivos se cierran tan pronto como termina el script. Que es ... inmediatamente. +1. – ch3ka

+1

@JohnMachin No presumí nada. Cambié lo menos posible para mostrar cómo convertir un archivo. 'with' no es necesario si el programa va a terminar inmediatamente; el archivo se cerrará. Agregué un comentario para indicar que se debe tener cuidado si se trata de un programa de ejecución prolongada. – agf

2

¿Por qué siempre se debe utilizar el modo 'rb' al leer archivos con el módulo 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. 

¿Qué hay en el archivo de ejemplo: cualquier basura de edad, incluyendo los caracteres de control obtenidos por la extracción de manchas o lo que sea a partir de una base de datos o uso imprudente de la función CHAR en las fórmulas de 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 sigue CP/M, MS-DOS y Windows cuando lee archivos en modo texto: \r\n se reconoce como el separador de línea y se sirve como \n, y \x1a también conocido como Ctrl-Z como END-OF-FILE marcador.

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

csv con un archivo abierto con 'rb' funciona como se espera:

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

pero el modo de texto sin que:

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

¿Tiene una referencia de python.org para el comportamiento de Ctrl-z? No veo ninguna mención de eso. – agf

+1

@agf: No. Es una consecuencia de que CPython 2.X delegue la responsabilidad de decidir qué hacer con la biblioteca '' C' stdio' del compilador de destino. –

Cuestiones relacionadas