2012-03-16 12 views
6

que tienen múltiples líneas de texto en un archivo de texto que se parecen a esto:¿Cómo usar múltiples delimitadores cuando se usa csv.reader en python?

2012-03-16 13:47:30.465 -0400 START Running Lab.script 19 on_the 

quiero ser capaz de convertir este archivo de texto en formato CSV. Ya he hecho que el uso de este código:

fin = csv.reader(open('LogFile.txt', 'rb'), delimiter='\t') 
fout = open('newLogFile.csv', 'w') 
for row in fin: 
    fout.write(','.join(row) + '\n') 

Pero ahora, mi problema es que tengo que ser capaz de añadir un "" después de que los espacios en esta parte de la línea:

2012-03-16 13:47:30.465 -0400 

no estoy seguro de cómo hacerlo, he intentado usar split(), para dividir la fila/posición actual, pero no funcionó. Cualquier sugerencia sería muy útil.

Gracias

Respuesta

3

Would útiles a la pestaña en su lugar sólo delimitan todo desde el principio? Si es así, puede consultar este answer, esencialmente

¡Hay un atajo de caso especial para exactamente este caso de uso!

Si llama a str.split sin un argumento, se divide en ejecuciones de espacios en blanco en lugar de caracteres individuales. Por lo tanto:

>>> ' '.join("Please \n don't \t hurt \x0b me.".split()) 
"Please don't hurt me." 

lo que para usted sería

newLogFile = open('newLogFile.csv', 'w') 
textFile = open('LogFile.txt', 'rb') 
for row in textFile: 
    newLogFile.write('\t'.join(row.split())) 

También dijo

Pero ahora, mi problema es que tengo que ser capaz de añadir una", "después de las espacios en esta parte de la línea:

2012-03-16 13:47:30.465 -0400

para mí que suena como desea

2012-03-16 ,13:47:30.465 ,-0400 
+1

Ambas respuestas fueron buenas, pero la tuya resolvió mi segundo problema donde no pude leer el archivo como csv.reader() después de que lo configuré originalmente. Gracias – user1186173

2

intente lo siguiente:

fin = csv.reader(open('LogFile.txt', 'rb'), delimiter='\t') 
fout = open('newLogFile.csv', 'w') 
for row in fin: 
    row[0] = ','.join(row[0].split()) 
    fout.write(','.join(row) + '\n') 

Esto tomará una fila que tiene este aspecto después de ser leído en por csv.reader():

['2012-03-16 13:47:30.465 -0400', 'START', 'Running', 'Lab.script', '19 ', 'on_the'] 

Y a continuación, cambiar el primer elemento de manera que se parezca a esto:

['2012-03-16,13:47:30.465,-0400', 'START', 'Running', 'Lab.script', '19 ', 'on_the'] 

Y después ','.join() en la fila se obtiene la línea que se escribirá en el archivo de salida:

'2012-03-16,13:47:30.465,-0400,START,Running,Lab.script,19,on_the' 

Si hay otros elementos que pueden tener espacios en ellos y que desea tratar a todos como un delimitador csv en su salida, puede hacer lo siguiente:

fin = csv.reader(open('LogFile.txt', 'rb'), delimiter='\t') 
fout = open('newLogFile.csv', 'w') 
for row in fin: 
    fout.write(','.join(','.join(item.split()) for item in row) + '\n') 
+0

Eso funcionó a la perfección! ¡Muchas gracias! – user1186173

+1

Hola, estaba intentando usar csv.reader() después de todo el proceso de escritura, y cada vez que lo hago "para remar en csv.reader(): imprimir fila [algún valor]", solo se imprimirá para la fila [0] de lo contrario, me da un error al decir que la lista está fuera de rango. También configuré el delimitador en "\ t", y aún así me dio ese error. – user1186173

+1

No lo resolví, gracias de todos modos – user1186173

Cuestiones relacionadas