172 votes

Comment obtenir le nombre total de lignes d'un fichier CSV en Python ?

J'utilise python (Django Framework) pour lire un fichier CSV. Je ne tire que 2 lignes de ce CSV comme vous pouvez le voir. Ce que j'ai essayé de faire est de stocker dans une variable le nombre total de lignes du CSV.

Comment puis-je obtenir le nombre total de lignes ?

file = object.myfilePath
fileObject = csv.reader(file)
for i in range(2):
    data.append(fileObject.next()) 

J'ai essayé :

len(fileObject)
fileObject.length

253voto

Martijn Pieters Points 271458

Vous devez compter le nombre de rangées :

row_count = sum(1 for row in fileObject)  # fileObject is your csv.reader

Utilisation de sum() avec une expression de générateur permet d'obtenir un compteur efficace, évitant de stocker tout le fichier en mémoire.

Si vous avez déjà lu 2 lignes au départ, vous devez ajouter ces 2 lignes à votre total ; les lignes qui ont déjà été lues ne sont pas comptées.

98voto

dixhom Points 759

2018-10-29 EDIT

Merci pour les commentaires.

J'ai testé plusieurs types de code pour obtenir le nombre de lignes dans un fichier csv en termes de vitesse. La meilleure méthode est ci-dessous.

with open(filename) as f:
    sum(1 for line in f)

Voici le code testé.

import timeit
import csv
import pandas as pd

filename = './sample_submission.csv'

def talktime(filename, funcname, func):
    print(f"# {funcname}")
    t = timeit.timeit(f'{funcname}("{filename}")', setup=f'from __main__ import {funcname}', number = 100) / 100
    print('Elapsed time : ', t)
    print('n = ', func(filename))
    print('\n')

def sum1forline(filename):
    with open(filename) as f:
        return sum(1 for line in f)
talktime(filename, 'sum1forline', sum1forline)

def lenopenreadlines(filename):
    with open(filename) as f:
        return len(f.readlines())
talktime(filename, 'lenopenreadlines', lenopenreadlines)

def lenpd(filename):
    return len(pd.read_csv(filename)) + 1
talktime(filename, 'lenpd', lenpd)

def csvreaderfor(filename):
    cnt = 0
    with open(filename) as f:
        cr = csv.reader(f)
        for row in cr:
            cnt += 1
    return cnt
talktime(filename, 'csvreaderfor', csvreaderfor)

def openenum(filename):
    cnt = 0
    with open(filename) as f:
        for i, line in enumerate(f,1):
            cnt += 1
    return cnt
talktime(filename, 'openenum', openenum)

Le résultat est le suivant.

# sum1forline
Elapsed time :  0.6327946722068599
n =  2528244

# lenopenreadlines
Elapsed time :  0.655304473598555
n =  2528244

# lenpd
Elapsed time :  0.7561274056295324
n =  2528244

# csvreaderfor
Elapsed time :  1.5571560935772661
n =  2528244

# openenum
Elapsed time :  0.773000013928679
n =  2528244

En conclusion, sum(1 for line in f) est le plus rapide. Mais il pourrait ne pas y avoir de différence significative entre len(f.readlines()) .

sample_submission.csv est de 30,2 Mo et compte 31 millions de caractères.

20voto

sam collins Points 199

Pour le faire, vous devez avoir un peu de code comme mon exemple ici :

file = open("Task1.csv")
numline = len(file.readlines())
print (numline)

J'espère que cela aidera tout le monde.

15voto

Old Bald Guy Points 153

Plusieurs des suggestions ci-dessus comptent le nombre de LIGNES dans le fichier csv. Mais certains fichiers CSV contiennent des chaînes citées qui contiennent elles-mêmes des caractères de nouvelle ligne. Les fichiers MS CSV délimitent habituellement les enregistrements avec \r\n mais utilisez \n uniquement à l'intérieur de chaînes de caractères entre guillemets.

Pour un fichier comme celui-ci, compter les lignes de texte (délimitées par une nouvelle ligne) dans le fichier donnera un résultat trop important. Pour un comptage précis, vous devez donc utiliser csv.reader pour lire les enregistrements.

12voto

serpiko Points 51

Après avoir itéré l'ensemble du fichier avec csv.reader() vous disposez du nombre total de lignes lues, via la variable d'instance line_num :

import csv
with open('csv_path_file') as f:
    csv_reader = csv.reader(f)
    for row in csv_reader:
        pass
    print(csv_reader.line_num)

Citation : la documentation officielle :

csvreader.line_num

Le nombre de lignes lues à partir de l'itérateur source.

Petite mise en garde :

  • nombre total de lignes, y compris l'en-tête, si le CSV en a un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X