Convierta un archivo delimitado por espacios en un archivo de valores separados por comas en Python

Soy muy nuevo en Python. Sé que esto ya se ha pedido y me disculpo, pero la diferencia en esta nueva situación es que los espacios entre las cadenas no son iguales. Tengo un archivo, llamado coord , que contiene las siguientes cadenas delimitadas por espacios:

1 C 6.00 0.000000000 1.342650315 0.000000000 2 C 6.00 0.000000000 -1.342650315 0.000000000 3 C 6.00 2.325538562 2.685300630 0.000000000 4 C 6.00 2.325538562 -2.685300630 0.000000000 5 C 6.00 4.651077125 1.342650315 0.000000000 6 C 6.00 4.651077125 -1.342650315 0.000000000 7 C 6.00 -2.325538562 2.685300630 0.000000000 8 C 6.00 -2.325538562 -2.685300630 0.000000000 9 C 6.00 -4.651077125 1.342650315 0.000000000 10 C 6.00 -4.651077125 -1.342650315 0.000000000 11 H 1.00 2.325538562 4.733763602 0.000000000 12 H 1.00 2.325538562 -4.733763602 0.000000000 13 H 1.00 -2.325538562 4.733763602 0.000000000 14 H 1.00 -2.325538562 -4.733763602 0.000000000 15 H 1.00 6.425098097 2.366881801 0.000000000 16 H 1.00 6.425098097 -2.366881801 0.000000000 17 H 1.00 -6.425098097 2.366881801 0.000000000 18 H 1.00 -6.425098097 -2.366881801 0.000000000 

Por favor, tenga en cuenta los espacios antes del inicio de cada cadena en la primera columna. Así que he intentado lo siguiente para convertirlo a csv:

 with open('coord') as infile, open('coordv', 'w') as outfile: outfile.write(infile.read().replace(" ", ", ")) # Unneeded columns are deleted from the csv input = open('coordv', 'rb') output = open('coordcsvout', 'wb') writer = csv.writer(output) for row in csv.reader(input): if row: writer.writerow(row) input.close() output.close() with open("coordcsvout","rb") as source: rdr= csv.reader( source ) with open("coordbarray","wb") as result: wtr= csv.writer(result) for r in rdr: wtr.writerow( (r[5], r[6], r[7]) ) 

Cuando ejecuto el script, obtengo lo siguiente para la coordenada en la primera parte del script, que por supuesto está muy mal:

 , 1, C, , , 6.00, , 0.000000000, , 1.342650315, , 0.000000000 , 2, C, , , 6.00, , 0.000000000, -1.342650315, , 0.000000000 , 3, C, , , 6.00, , 2.325538562, , 2.685300630, , 0.000000000 , 4, C, , , 6.00, , 2.325538562, -2.685300630, , 0.000000000 , 5, C, , , 6.00, , 4.651077125, , 1.342650315, , 0.000000000 , 6, C, , , 6.00, , 4.651077125, -1.342650315, , 0.000000000 , 7, C, , , 6.00, -2.325538562, , 2.685300630, , 0.000000000 , 8, C, , , 6.00, -2.325538562, -2.685300630, , 0.000000000 , 9, C, , , 6.00, -4.651077125, , 1.342650315, , 0.000000000 , 10, C, , , 6.00, -4.651077125, -1.342650315, , 0.000000000 , 11, H, , , 1.00, , 2.325538562, , 4.733763602, , 0.000000000 , 12, H, , , 1.00, , 2.325538562, -4.733763602, , 0.000000000 , 13, H, , , 1.00, -2.325538562, , 4.733763602, , 0.000000000 , 14, H, , , 1.00, -2.325538562, -4.733763602, , 0.000000000 , 15, H, , , 1.00, , 6.425098097, , 2.366881801, , 0.000000000 , 16, H, , , 1.00, , 6.425098097, -2.366881801, , 0.000000000 , 17, H, , , 1.00, -6.425098097, , 2.366881801, , 0.000000000 , 18, H, , , 1.00, -6.425098097, -2.366881801, , 0.000000000 

He intentado diferentes posibilidades en .replace sin ningún éxito, y hasta ahora no he encontrado ninguna fuente de información sobre cómo podría hacer esto. ¿Cuál sería la mejor manera de obtener valores separados por comas de este archivo de coordenadas ? Lo que me interesa es usar el módulo csv en python para elegir las columnas 4: 6 y finalmente usar numpy para importarlas de la siguiente manera:

 from numpy import genfromtxt cocmatrix = genfromtxt('input', delimiter=',') 

Me alegraría mucho si alguien pudiera ayudarme con este problema.

Related of "Convierta un archivo delimitado por espacios en un archivo de valores separados por comas en Python"

Reemplace su primer bit con esto. No es muy bonito, pero le dará un formato CSV.

 with open('coord') as infile, open('coordv', 'w') as outfile: for line in infile: outfile.write(" ".join(line.split()).replace(' ', ',')) outfile.write(",") # trailing comma shouldn't matter 

Si desea que el outfile.write("\n") tenga todo en líneas diferentes, puede agregar el outfile.write("\n") al final del bucle for, pero no creo que el código que sigue a continuación funcione así.

Puedes usar csv:

 import csv with open(ur_infile) as fin, open(ur_outfile, 'w') as fout: o=csv.writer(fout) for line in fin: o.writerow(line.split()) 

Puedes usar pandas de Python , he escrito tus datos en data.csv :

 import pandas as pd >>> df = pd.read_csv('data.csv',sep='\s+',header=None) >>> df 0 1 2 3 4 5 0 1 C 6 0.000000 1.342650 0 1 2 C 6 0.000000 -1.342650 0 2 3 C 6 2.325539 2.685301 0 3 4 C 6 2.325539 -2.685301 0 4 5 C 6 4.651077 1.342650 0 5 6 C 6 4.651077 -1.342650 0 ... 

Lo mejor de esto es que para acceder a la matriz numpy subyacente puede usar df.values :

 >>> type(df.values)  

Para guardar el dataframe con delimitadores de coma:

 >>> df.to_csv('data_out.csv',header=None) 

Pandas es una excelente biblioteca para administrar grandes cantidades de datos, como beneficio adicional, funciona bien con números. También existe una gran posibilidad de que esto sea mucho más rápido que el uso del módulo csv .

 >>> a = 'cah 1 C 6.00 0.000000000 1.342650315 0.000000000' => a = 'cah 1 C 6.00 0.000000000 1.342650315 0.000000000' >>> a.split() => ['cah', '1', 'C', '6.00', '0.000000000', '1.342650315', '0.000000000'] >>> ','.join(a.split()) => 'cah,1,C,6.00,0.000000000,1.342650315,0.000000000' >>> ['"' + x + '"' for x in a.split()] => ['"cah"', '"1"', '"C"', '"6.00"', '"0.000000000"', '"1.342650315"', '"0.000000000"'] >>> ','.join(['"' + x + '"' for x in a.split()] => '"cah","1","C","6.00","0.000000000","1.342650315","0.000000000"' 

¿Por qué no leer un archivo línea por línea? Divida una línea en una lista y luego vuelva a unirse a una lista con ‘,’.

El módulo csv es bueno, o aquí hay una manera de hacerlo sin:

 #!/usr/local/cpython-3.3/bin/python with open('input-file.csv', 'r') as infile, open('output.csv', 'w') as outfile: for line in infile: fields = line.split() outfile.write('{}\n'.format(','.join(fields)))