web-dev-qa-db-fra.com

Comptez combien de lignes sont dans un Python CSV?

J'utilise python (Django Framework) pour lire un fichier CSV. Je ne tire que 2 lignes de ce fichier CSV, comme vous pouvez le voir. Ce que j'ai essayé de faire est de stocker également dans une variable le nombre total de lignes du fichier 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
86
GrantU

Vous devez compter le nombre de lignes:

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

Utiliser sum() avec une expression génératrice constitue un compteur efficace en évitant de stocker le fichier entier en mémoire.

Si vous avez déjà lu 2 lignes pour commencer, vous devez ajouter ces 2 lignes à votre total; les lignes déjà lues ne sont pas comptées.

146
Martijn Pieters

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 était en dessous.

# 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 par rapport à len(f.readlines()).

sample_submission.csv mesure 30,2 Mo et contient 31 millions de caractères.

48
dixhom

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 aide tout le monde.

12
sam collins

Plusieurs des suggestions ci-dessus comptent le nombre de LIGNES dans le fichier csv. Cependant, certains fichiers CSV contiennent des chaînes entre guillemets contenant eux-mêmes des caractères de nouvelle ligne. Les fichiers MS CSV délimitent généralement les enregistrements avec\r\n, mais utilisent\n seuls dans les chaînes entre guillemets.

Pour un fichier de ce type, compter les lignes de texte (délimitées par une nouvelle ligne) dans le fichier donnera un résultat trop volumineux. Donc, pour obtenir un décompte précis, vous devez utiliser csv.reader pour lire les enregistrements.

7
Old Bald Guy

row_count = sum(1 for line in open(filename)) a travaillé pour moi.

Note: sum(1 for line in csv.reader(filename)) semble calculer la longueur de la première ligne

6
Mithilesh Gupta

Vous devez d’abord ouvrir le fichier avec open

input_file = open("nameOfFile.csv","r+")

Ensuite, utilisez le fichier csv.reader pour ouvrir le fichier csv.

reader_file = csv.reader(input_file)

A la fin, vous pouvez prendre le nombre de lignes avec l'instruction 'len'

value = len(list(reader_file))

Le code total est ceci:

input_file = open("nameOfFile.csv","r+")
reader_file = csv.reader(input_file)
value = len(list(reader_file))

Rappelez-vous que si vous voulez réutiliser le fichier csv, vous devez créer un fichier input_file.fseek (0), car lorsque vous utilisez une liste pour le fichier reader_file, il lit tout le fichier et le pointeur du fichier change de position.

2
protti

lorsque vous instanciez un objet csv.reader et que vous parcourez l'intégralité du fichier, vous pouvez accéder à une variable d'instance appelée line_num fournissant le nombre de lignes:

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)
2
serpiko
numline = len(file_read.readlines())
2
Alex Troush

Utilisez "list" pour adapter un objet plus fonctionnel.

Vous pouvez alors compter, sauter, muter jusqu'au désir de votre coeur:

list(fileObject) #list values

len(list(fileObject)) # get length of file lines

list(fileObject)[10:] # skip first 10 lines
2
Sean

Cela fonctionne pour csv et tous les fichiers contenant des chaînes dans les systèmes d'exploitation Unix:

import os

numOfLines = int(os.popen('wc -l < file.csv').read()[:-1])

Si le fichier csv contient une ligne de champs, vous pouvez en déduire une de numOfLines ci-dessus:

numOfLines = numOfLines - 1
1
Amir

voudrez peut-être essayer quelque chose d'aussi simple que ci-dessous dans la ligne de commande:

sed -n '$=' filename ou wc -l filename

1
kevin
import csv
count = 0
with open('filename.csv', 'rb') as count_file:
    csv_reader = csv.reader(count_file)
    for row in csv_reader:
        count += 1

print count
1
akshaynagpal

essayer

data = pd.read_csv("data.csv")
data.shape

et dans la sortie, vous pouvez voir quelque chose comme (aa, bb) où aa est le # de lignes

0
Ruben Romo

Je pense que nous pouvons améliorer un peu la meilleure réponse, j'utilise:

len = sum(1 for _ in reader)

De plus, il ne faut pas oublier que le code Pythonic n’a pas toujours les meilleures performances du projet. Par exemple: Si nous pouvons faire plus d'opérations en même temps dans le même ensemble de données, il est préférable de tout faire dans le même fichier plutôt que de créer deux ou plusieurs cycles Pythonic.

0
David Martínez