web-dev-qa-db-fra.com

lire et analyser un fichier TSV, puis le manipuler pour le sauvegarder au format CSV (* efficacement *)

Mes données source sont dans un fichier TSV, 6 colonnes et plus de 2 millions de lignes.

Voici ce que j'essaie d'accomplir:

  1. J'ai besoin de lire les données dans 3 des colonnes (3, 4, 5) de ce fichier source
  2. La cinquième colonne est un entier. Je dois utiliser cette valeur entière pour dupliquer une entrée de ligne en utilisant les données des troisième et quatrième colonnes (en fonction du nombre de fois de l'entier).
  3. Je veux écrire la sortie de # 2 dans un fichier de sortie au format CSV.

Ci-dessous est ce que je suis venu avec.

Ma question: est-ce un moyen efficace de le faire? Il semble que cela pourrait être intensif lors d'une tentative sur 2 millions de lignes.

Tout d'abord, j'ai créé un fichier séparé avec un onglet échantillon, que j'ai appelé "échantillon.txt". C'est basique et n'a que quatre lignes:

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

alors j'ai ce 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

Vous devriez utiliser le module csv pour lire le fichier de valeurs séparé par des tabulations. Ne pas lisez-le en mémoire en une fois. Chaque ligne que vous lisez contient toutes les informations dont vous avez besoin pour écrire des lignes dans le fichier CSV de sortie, après tout. Gardez le fichier de sortie ouvert pendant tout le processus.

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

ou, en utilisant le module itertools pour répéter l'opération avec 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