2012-11-07 4 views
1

Pour mes besoins, je dois connaître le nombre de lignes dans le fichier (CSV) avant de travailler avec des lignes. J'ai googlé et trouvé que la documentation dit que je devrais créer un itérateur (CSV.reader) pour deux fois (le premier pour compter et le second pour travailler avec des rangées). Est-ce la seule façon ou peut-être il y a une méthode délicate pour faire un tour?Manipulations CSV avec python

Merci pour vos réponses.

+1

nous devons d'abord comprendre Pourquoi avez-vous besoin du nombre de lignes avant de travailler avec elles? –

+0

Si le nombre de lignes> N (où N est différent pour chaque utilisateur) je ne devrais pas traiter le fichier. – alexvassel

+0

Il me semble qu'il n'y a pas d'autre moyen de le faire - en tout cas lire toutes les lignes et continuer toutes les lignes sont différentes choses - donc je vous suggère de lire tout ce que la taille d'enregistrement et si ça va continuer lines - sinon, passez au fichier suivant –

Répondre

1

si votre fichier est pas très grand que vous pouvez essayer:

from csv import reader 

def proceed(size): 
    with open(filename) as f: 
     data = list(csv.reader(f)) 
     if len(data) > size: 
      return 
     else: 
      for line in data: 
       #do action 


weights = {'user1': 4, 'user2': 5} 
for k,v in weights.iteritems(): 
    proceed(v) 

Ou comme suggéré par @georgesl dans le cas où vous avez un très gros fichier:

def proceed(size): 
    if sum(1 for row in csv.reader(open(filename))) > size: 
     return 
    else: 
     for line in csv.reader(open(filename)): 
      #do action 
+0

Quelle est la taille appropriée d'un fichier? Qu'en est-il de 100KB? – alexvassel

+1

si vos fichiers sont grands, peut-être 'row_count = sum (1 pour la ligne dans csv.reader (open ('filename.csv')))' est mieux pour la taille – lucasg

+0

@alexvassel La taille de fichier appropriée est quelque chose qui ne sera pas mettez votre machine dans une coma - un fichier CSV 1gb ne sera probablement pas stresser la plupart des machines modernes ... –

1

Je ne sais pas d'une manière sans lire le fichier, mais en fonction de l'endroit où vos goulots d'étranglement sont vous pouvez simplement traiter N lignes, et s'il y a plus de les jeter, par exemple:

count = 0 
for line in reader: 
    count += 1 
    if count > N: # Over the limit so stop processing 
     break 
    else: 
     processed_data += process(line) 
else: 
    # This block only runs if the loop completed naturally, i.e. count <= N 
    return processed_data 

Si process(line) est cher, alors votre meilleur pari peut être d'utiliser deux boucles comme décrit dans votre question.