2013-02-23 8 views
1

J'ai un lot de 50-60 fichiers CSV qui, pour une raison quelconque, ont des données indésirables totales pour les quatre premières lignes de chaque fichier. Après les données indésirables, cependant, les en-têtes de colonne sont correctement répertoriés et le reste du fichier est correct. Comment pourrais-je supprimer les fichiers de ces quatre premiers fichiers en python? Voici mon code jusqu'ici:Supprimer les quatre premières lignes d'un fichier CSV en Python?

import csv 
total = open('C:\\Csv\\201.csv', 'rb') 
for row in csv.reader(total): 
    print row 

Comme vous pouvez le voir, tout ce que je l'ai fait est ouvert le fichier et son contenu imprimé. J'ai recherché des solutions de suppression de certains aspects des fichiers CSV, mais la plupart suppriment des colonnes entières ou dépendent d'une condition particulière pour que la ligne soit supprimée. Dans mon cas, c'est simplement une question d'ordre, et chaque fichier doit être dépouillé de ses quatre premières lignes. Toute aide est grandement appréciée.

Répondre

3
for i, line in enumerate(sys.stdin, -4): 
    if i>=0: print line, 
+0

Dang. Code solide et concis. Fonctionne parfaitement. Je vous remercie! – user1067257

4

Vous pouvez faire:

reader = csv.reader(total) 
all(next(reader) for i in range(4)) 

ou

for i in range(4): next(reader) 
+0

C'est créatif. Je n'aurais jamais pensé à utiliser "tout". – user1067257

+3

'any' saute seulement la première ligne,' all' saute toutes les quatre lignes. –

+0

@HaiVu: Bien sûr! Je pense que je dois faire plus attention. –

0

Vous pouvez écrire une fonction générique pour sauter les premiers éléments n de toute séquence:

def skip_first(seq, n): 
    for i,item in enumerate(seq): 
     if i >= n: 
      yield item 

Pour utilisez-le:

import csv 
with open('C:\\Csv\\201.csv', 'rb') as total: 
    csvreader = csv.reader(total) 
    for row in skip_first(csvreader, 4): 
     print row 

Cette fonction est générique car il peut sauter toute séquence, pas simplement déposer:

# Skip the first three 
list = ['happy', 'grumpy', 'doc', 'sleepy', 'bashful', 'sneezy', 'dopey'] 
for item in skip_first(list, 3): 
    print item 
0

Je ne suis pas surpris n'a suggéré la façon d'utiliser Pythonic islice ici ...

from itertools import islice 
with open('somefile') as fin: 
    csvin = islice(csv.reader(fin), 4, None, None) 
    for row in csvin: 
     pass 

exemple:

>>> r = range(10); list(islice(r, 4, None, None)) 
[4, 5, 6, 7, 8, 9] 
0

N l'une des réponses semble prendre en compte la ligne d'en-tête requise pour DictReader: à moins que la première ligne ne contienne autre chose que la liste des champs, DictReader ne les reconnaîtra pas et les analysera correctement.

Et parce que csv.reader attend un objet semblable à un fichier, j'ai dû utiliser StringIO comme tampon temporaire (pas un problème sérieux, j'ai habituellement environ 20 lignes là).

with StringIO() as csvio: 
    for i, line in enumerate(myfile.iter_lines()): 
     if i < 5: 
      continue 
     else: 
      csvio.write(line) 

    reader = csv.DictReader(csvio) 

apprécierait de meilleures suggestions pour créer des objets de fichiers comme pour toutes les lignes sauf la première N sans mise en mémoire tampon si tout en mémoire.

Questions connexes