Análisis de archivos de texto con Python

Estoy tratando de analizar una serie de archivos de texto y guardarlos como archivos CSV utilizando Python (2.7.3). Todos los archivos de texto tienen un encabezado de 4 líneas que debe eliminarse. Las líneas de datos tienen varios delimitadores que incluyen “(quote), – (dash),: column, y espacios en blanco. Me costó mucho codificarlo en C ++ con todos estos delimitadores diferentes, así que decidí probarlo en Python al escucharlo Es relativamente más fácil de hacer en comparación con C / C ++.

Escribí un fragmento de código para probarlo para una sola línea de datos y funciona, sin embargo, no pude lograr que funcionara para el archivo real. Para analizar una sola línea estaba usando el objeto de texto y el método “reemplazar”. Parece que mi implementación actual lee el archivo de texto como una lista, y no hay un método de reemplazo para el objeto de la lista.

Siendo un novato en Python, me quedé atascado en este punto. Cualquier entrada sería apreciada!

¡Gracias!

# function for parsing the data def data_parser(text, dic): for i, j in dic.iteritems(): text = text.replace(i,j) return text # open input/output files inputfile = open('test.dat') outputfile = open('test.csv', 'w') my_text = inputfile.readlines()[4:] #reads to whole text file, skipping first 4 lines # sample text string, just for demonstration to let you know how the data looks like # my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636' # dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' } txt = data_parser(my_text, reps) outputfile.writelines(txt) inputfile.close() outputfile.close() 

Usaría un bucle for para iterar sobre las líneas en el archivo de texto:

 for line in my_text: outputfile.writelines(data_parser(line, reps)) 

Si desea leer el archivo línea por línea en lugar de cargar todo al inicio del script, puede hacer algo como esto:

 inputfile = open('test.dat') outputfile = open('test.csv', 'w') # sample text string, just for demonstration to let you know how the data looks like # my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636' # dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' } for i in range(4): inputfile.next() # skip first four lines for line in inputfile: outputfile.writelines(data_parser(line, reps)) inputfile.close() outputfile.close() 

De la respuesta aceptada, parece que tu comportamiento deseado es girar

 skip 0 skip 1 skip 2 skip 3 "2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636 

dentro

 2012,06,23,03,09,13.23,4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,NAN,-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636 

Si eso es correcto, entonces pienso algo como

 import csv with open("test.dat", "rb") as infile, open("test.csv", "wb") as outfile: reader = csv.reader(infile) writer = csv.writer(outfile, quoting=False) for i, line in enumerate(reader): if i < 4: continue date = line[0].split() day = date[0].split('-') time = date[1].split(':') newline = day + time + line[1:] writer.writerow(newline) 

Sería un poco más simple que las cosas de los reps .

Hay algunas maneras de hacer esto. Una opción sería usar inputfile.read() lugar de inputfile.readlines() – necesitarías escribir un código separado para eliminar las primeras cuatro líneas, pero si quieres la salida final como una sola cadena de todos modos, esto podría hacer que el mas sentido

Una segunda opción, más simple, sería volver a unir las cadenas después de separar las primeras cuatro líneas con my_text = ''.join(my_text) . Esto es un poco ineficiente, pero si la velocidad no es una preocupación importante, el código será el más simple.

Finalmente, si realmente desea la salida como una lista de cadenas en lugar de una sola cadena, simplemente puede modificar su analizador de datos para iterar sobre la lista. Eso podría ser algo como esto:

 def data_parser(lines, dic): for i, j in dic.iteritems(): for (k, line) in enumerate(lines): lines[k] = line.replace(i, j) return lines