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
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.
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.
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.
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.
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
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.
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)
numline = len(file_read.readlines())
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
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
voudrez peut-être essayer quelque chose d'aussi simple que ci-dessous dans la ligne de commande:
sed -n '$=' filename
ou wc -l filename
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
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
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.