convertir un archivo delimitado por espacios a un CSV

Tengo un archivo de texto que contiene datos tabulares. Lo que debo hacer es automatizar la tarea de escribir en un nuevo archivo de texto que esté delimitado por comas en lugar de delimitado por espacios, extraer algunas columnas de los datos existentes, reordenar las columnas.

Este es un fragmento de las primeras 4 líneas de los datos originales:

 Número de filas: 8542
  Algoritmo | Fecha | Hora | Longitud | Latitud | País    
  1 2000-01-03 215926.688 -0.262 35.813 Argelia 
  1 2000-01-03 215926.828 -0.284 35.817 Argelia

Esto es lo que quiero al final:

 Longitud, latitud, país, fecha, hora
 -0.262,35.813, Argelia, 2000-01-03,215926.688

¿Algún consejo sobre cómo abordar esto?

Supongo que el archivo está separado por tabs, no espacios.

Si es así, puedes probar algo como:

input_file = open('some_tab_separated_file.txt', 'r') output_file = open('some_tab_separated_file.csv', 'w') input_file.readline() # skip first line for line in input_file: (a, date, time, lon, lat, country) = line.strip().split('\t') output_file.write(','.join([lon, lat, country, date, time]) + '\n') input_file.close() output_file.close() 

Este código no se ha probado, cualquier error queda para usted como ejercicio.

Puede usar el módulo csv y un lector con el delimitador ' ' para leer sus datos, y usar un escritor del mismo módulo (con un delimitador de coma) para producir la salida.

De hecho, el primer ejemplo en la documentación del módulo csv usa delimiter=' ' .

Puede usar un DictReader / DictWriter y especificar el orden de las columnas en su constructor (lista de fieldnames : diferente para el lector / escritor si desea reordenar) para generar las entradas en el orden que desee.

(Es posible que deba omitir / ignorar sus primeras dos filas al producir la salida).

EDITAR:

Aquí hay un ejemplo para tratar con nombres de países de varias palabras:

 import cStringIO import csv f = cStringIO.StringIO("""ABC 1 2 Costa Rica 3 4 Democratic Republic of the Congo """) r = csv.DictReader(f, delimiter=' ', restkey='rest') for row in r: if row.get('rest'): row['C'] += " %s" % (" ".join(row['rest'])) print 'A: %s, B: %s, C: %s' % (row['A'], row['B'], row['C']) 

Utilice restkey= y concatene la entrada de dict para ese valor, que es una lista de lo que queda (aquí restkey='rest' ). Esto imprime:

 A: 1, B: 2, C: Costa Rica A: 3, B: 4, C: Democratic Republic of the Congo 

str.split() sin ningún argumento se dividirá por cualquier espacio en blanco. operator.itemgetter() toma varios argumentos y devolverá una tupla.

Supongo que la idea importante es que tienes que usar ‘\ t’ como delimitador @Paulo Scardine.

Solo quería agregar que pandas es una muy buena biblioteca para manejar datos de columnas.

 >>> src = 'path/to/file' >>> dest = 'path/to/dest_csv' >>> column_names = ['names', 'of', 'columns'] >>> df = pd.read_csv(src, delimiter='\t', names=column_names) # Do something in pandas if you need to >>> df.to_csv(dest, index=False, sep = ';')