J'utilise le lecteur csv pythons. Comment puis-je utiliser le code suivant de telle sorte qu'il ignore les lignes vides.

import csv
f1 = open ("ted.csv")
oldFile1 = csv.reader(f1, delimiter=',', quotechar='"')
oldList1 = list(oldFile1)
f2 = open ("ted2.csv")
newFile2 = csv.reader(f2, delimiter=',', quotechar='"')
newList2 = list(newFile2)

f1.close()
f2.close()

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out:
     r1, r2 = csv.reader(f1), csv.reader(f2)
     st = set((row[0], row[3]) for row in r1)
     wr = csv.writer(out)
     for row in (row for row in r2 if (row[0],row[3]) not in st):
           wr.writerow(row)
1
Michal K 20 juil. 2015 à 07:25

2 réponses

Meilleure réponse

Si vos fichiers csv commencent par une ligne vide, je pense que vous devriez pouvoir sauter cette ligne avec readline() avant de créer le lecteur csv:

with open("ted.csv") as f1, open("ted2.csv") as f2, open('foo.csv', 'w') as out:
    f1.readline()
    f2.readline()
    r1, r2 = csv.reader(f1), csv.reader(f2)
1
Marius 20 juil. 2015 à 04:38

Si vos blancs sont toujours sur la première ligne, la réponse de Marius est la plus simple. Si vous avez n blancs au début ou si vous voulez simplement sauter un certain nombre de lignes, vous pouvez utiliser itertools.islice().

Ignorer les N premières lignes

Supposons que vous souhaitiez sauter les 4 premières lignes (lignes vides ou non):

from itertools import islice
with open('csv2.csv', 'r') as f1, open('out.csv', 'w') as out:
    filt_f1 = islice(f1, 4, None)
    r1 = csv.reader(filt_f1)
    wr = csv.writer(out)
    for line in r1:
        ...

Lignes vides partout

Si vous avez des lignes vides dispersées dans vos fichiers, vous pouvez les filtrer avec { {X0}}.

import csv
from itertools import filterfalse
from itertools import chain

with open('csv1.csv', 'r') as f1, open('csv2.csv', 'r') as f2, open('out.csv', 'w') as out:
    # create an iterator without lines that start with '\n'
    filt_f1 = filterfalse(lambda line: line.startswith('\n'), f1)
    filt_f2 = filterfalse(lambda line: line.startswith('\n'), f2)

    # csv.reader consumes the filtered iterators
    r1, r2 = csv.reader(filt_f1), csv.reader(filt_f2)
    wr = csv.writer(out)

    # here insert your logic, I just write both to the same file
    for line in chain(r1, r2):
        wr.writerow(line)

Où csv1.csv est:

time,name,location
12345,Jean,Montreal

12346,Peter,Chicago

1234589,Doug,Boston

Et csv2.csv ( remarque : non affiché ici, mais csv2.csv comporte 4 lignes vides en haut du fichier):

123457,Scott,San Diego

123458,Jen,Miami

123459,Robert,Sacramento

Output out.csv n'a pas de lignes vides partout:

time,name,location
12345,Jean,Montreal
12346,Peter,Chicago
1234589,Doug,Boston
123457,Scott,San Diego
123458,Jen,Miami
123459,Robert,Sacramento
2
Scott 20 juil. 2015 à 07:19