python - tablas - leer y analizar un archivo TSV, luego manipularlo para guardarlo como CSV(* eficientemente*)
operaciones con archivos csv python (1)
Mis datos de origen están en un archivo TSV, 6 columnas y más de 2 millones de filas.
Esto es lo que estoy tratando de lograr:
- Necesito leer los datos en 3 de las columnas (3, 4, 5) en este archivo fuente
- La quinta columna es un número entero. Necesito usar este valor entero para duplicar una entrada de fila con el uso de los datos en la tercera y cuarta columnas (por el número de veces enteras).
- Quiero escribir el resultado del n. ° 2 en un archivo de salida en formato CSV.
A continuación es lo que se me ocurrió.
Mi pregunta: ¿es esta una manera eficiente de hacerlo? Parece que podría ser intenso cuando se intenta en 2 millones de filas.
Primero, hice una pestaña de muestra con un archivo separado para trabajar, y lo llamé ''sample.txt''. Es básico y solo tiene cuatro filas:
Row1_Column1 Row1-Column2 Row1-Column3 Row1-Column4 2 Row1-Column6
Row2_Column1 Row2-Column2 Row2-Column3 Row2-Column4 3 Row2-Column6
Row3_Column1 Row3-Column2 Row3-Column3 Row3-Column4 1 Row3-Column6
Row4_Column1 Row4-Column2 Row4-Column3 Row4-Column4 2 Row4-Column6
entonces tengo este código:
import csv
with open(''sample.txt'',''r'') as tsv:
AoA = [line.strip().split(''/t'') for line in tsv]
for a in AoA:
count = int(a[4])
while count > 0:
with open(''sample_new.csv'',''ab'') as csvfile:
csvwriter = csv.writer(csvfile, delimiter='','')
csvwriter.writerow([a[2], a[3]])
count = count - 1
Debe usar el módulo csv
para leer el archivo de valores separados por tabulaciones. No lo lea en la memoria de una vez. Cada fila que lee tiene toda la información que necesita para escribir filas en el archivo CSV de salida, después de todo. Mantenga el archivo de salida abierto todo el tiempo.
import csv
with open(''sample.txt'',''rb'') as tsvin, open(''new.csv'', ''wb'') as csvout:
tsvin = csv.reader(tsvin, delimiter=''/t'')
csvout = csv.writer(csvout)
for row in tsvin:
count = int(row[4])
if count > 0:
csvout.writerows([row[2:4] for _ in xrange(count)])
o, usando el módulo itertools
para hacer la repetición con itertools.repeat()
:
from itertools import repeat
import csv
with open(''sample.txt'',''rb'') as tsvin, open(''new.csv'', ''wb'') as csvout:
tsvin = csv.reader(tsvin, delimiter=''/t'')
csvout = csv.writer(csvout)
for row in tsvin:
count = int(row[4])
if count > 0:
csvout.writerows(repeat(row[2:4], count))