web-dev-qa-db-ger.com

Lesen und Parsen einer TSV-Datei und anschließende Bearbeitung zum Speichern als CSV (* effizient *)

Meine Quelldaten befinden sich in einer TSV-Datei mit 6 Spalten und mehr als 2 Millionen Zeilen.

Folgendes versuche ich zu erreichen:

  1. Ich muss die Daten in 3 der Spalten (3, 4, 5) in dieser Quelldatei lesen
  2. Die fünfte Spalte ist eine ganze Zahl. Ich muss diesen ganzzahligen Wert verwenden, um einen Zeileneintrag mit den Daten in der dritten und vierten Spalte (durch die Anzahl der ganzzahligen Male) zu duplizieren.
  3. Ich möchte die Ausgabe von # 2 in eine Ausgabedatei im CSV-Format schreiben.

Unten ist, was ich mir ausgedacht habe.

Meine Frage: Ist dies ein effizienter Weg, dies zu tun? Es sieht so aus, als ob es bei einem Versuch mit 2 Millionen Zeilen sehr intensiv sein könnte.

Zuerst habe ich eine separate Beispiel-Tab-Datei erstellt und sie 'sample.txt' genannt. Es ist einfach und hat nur vier Zeilen:

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

dann habe ich diesen code:

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
63
CJH

Sie sollten das Modul csv verwenden, um die durch Tabulatoren getrennte Wertedatei zu lesen. Lesen Sie nicht auf einmal in den Speicher. Jede Zeile, die Sie lesen, enthält schließlich alle Informationen, die Sie zum Schreiben von Zeilen in die Ausgabe-CSV-Datei benötigen. Lassen Sie die Ausgabedatei durchgehend geöffnet.

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)])

oder mit dem Modul itertools wiederholen mit 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))
126
Martijn Pieters