Par exemple si mon fichier texte est:
blue
green
yellow
black
Ici, il y a quatre lignes et maintenant je veux obtenir le résultat comme quatre. Comment puis je faire ça?
Vous pouvez utiliser sum()
avec une expression génératrice:
with open('data.txt') as f:
print sum(1 for _ in f)
Notez que vous ne pouvez pas utiliser len(f)
, car f
est un iterator . _
est un nom de variable spécial pour les variables à jeter, voir Quel est le but de la variable simple soulignement "_" en Python? .
Vous pouvez utiliser len(f.readlines())
, mais cela créera une liste supplémentaire en mémoire, qui ne fonctionnera même pas avec des fichiers volumineux qui ne tiennent pas dans la mémoire.
Ce lien ( Comment obtenir un comptage de lignes pas cher en Python? ) offre de nombreuses solutions potentielles, mais elles ignorent toutes la possibilité de le rendre beaucoup plus rapide, à savoir en utilisant l’interface non tamponnée faire votre propre mise en mémoire tampon.
En utilisant une version modifiée de l'outil de chronométrage, je pense que le code suivant est plus rapide (et légèrement plus pythonique) que les solutions proposées:
def _make_gen(reader):
b = reader(1024 * 1024)
while b:
yield b
b = reader(1024*1024)
def rawpycount(filename):
f = open(filename, 'rb')
f_gen = _make_gen(f.raw.read)
return sum( buf.count(b'\n') for buf in f_gen )
Voici mes timings:
rawpycount 0.0048 0.0046 1.00
bufcount 0.0074 0.0066 1.43
wccount 0.01 0.01 2.17
itercount 0.014 0.014 3.04
opcount 0.021 0.02 4.43
kylecount 0.023 0.021 4.58
simplecount 0.022 0.022 4.81
mapcount 0.038 0.032 6.82
Je le posterais là-bas, mais je suis un utilisateur relativement nouveau pour pouvoir empiler des échanges et ne pas avoir la manne requise.
MODIFIER:
Cela peut être fait complètement avec les expressions de générateurs en ligne en utilisant itertools, mais cela devient plutôt étrange:
from itertools import (takewhile,repeat)
def rawbigcount(filename):
f = open(filename, 'rb')
bufgen = takewhile(lambda x: x, (f.raw.read(1024*1024) for _ in repeat(None)))
return sum( buf.count(b'\n') for buf in bufgen if buf )
Vous pouvez utiliser sum()
avec une expression de générateur ici. L'expression du générateur sera [1, 1, ...]
jusqu'à la longueur du fichier. Ensuite, nous appelons sum()
pour les ajouter tous ensemble, afin d'obtenir le nombre total.
with open('text.txt') as myfile:
count = sum(1 for line in myfile)
D'après ce que vous avez essayé, il semble que vous ne voulez pas inclure de lignes vides. Vous pouvez alors faire:
with open('text.txt') as myfile:
count = sum(1 for line in myfile if line.rstrip('\n'))
count=0
with open ('filename.txt','rb') as f:
for line in f:
count+=1
print count
Bon mot:
total_line_count = sum(1 for line in open("filename.txt"))
print(total_line_count)
voici comment vous pouvez le faire grâce à la compréhension de liste, mais cela gaspillera un peu de la mémoire de votre ordinateur car line.strip () a été appelé deux fois.
with open('textfile.txt') as file:
lines =[
line.strip()
for line in file
if line.strip() != '']
print("number of lines = {}".format(len(lines)))
celui-ci donne également le nombre de lignes dans un fichier.
a=open('filename.txt','r')
l=a.read()
count=l.splitlines()
print(len(count))
Utilisation:
num_lines = sum(1 for line in open('data.txt'))
print(num_lines)
Ça marchera.
Pour ceux qui disent d'utiliser with open ("filename.txt","r") as f
, vous pouvez utiliser anyname = open("filename.txt","r")
def main():
file = open("infile.txt",'r')
count = 0
for line in file:
count+=1
print (count)
main ()
si vous importez pandas
, vous pouvez utiliser la fonction shape
pour le déterminer. Je ne sais pas comment ça se passe. Le code est le suivant:
import pandas as pd
data=pd.read_csv("yourfile") #reads in your file
num_records=[] #creates an array
num_records=data.shape #assigns the 2 item result from shape to the array
n_records=num_records[0] #assigns number of lines to n_records
Je ne suis pas nouveau dans stackoverflow, je n'ai jamais eu de compte et je venais généralement ici pour obtenir des réponses. Je ne peux pas commenter ou voter une réponse pour le moment. MAIS je voulais dire que le code de Michael Bacon ci-dessus fonctionne vraiment bien. Je suis nouveau sur Python mais pas sur la programmation. Je lisais Python Crash Course et il y a quelques choses que je voulais faire pour casser l'approche de la lecture à la lecture. Un utilitaire utilisable du point de vue d'un ETL ou même de la qualité des données serait de capturer le nombre de lignes d'un fichier indépendamment de tout ETL. Le fichier a un nombre X de lignes, vous importez dans SQL ou Hadoop et vous vous retrouvez avec un nombre X de lignes. Vous pouvez valider au niveau le plus bas le nombre de lignes d'un fichier de données brutes.
J'ai joué avec son code et fait quelques tests et ce code est très efficace jusqu'à présent. J'ai créé plusieurs fichiers CSV, différentes tailles et nombres de lignes. Vous pouvez voir mon code ci-dessous et mes commentaires fournissent les temps et les détails. Le code fourni par Michael Bacon ci-dessus est environ 6 fois plus rapide que la méthode Python normale consistant à simplement boucler les lignes.
J'espère que ça aide quelqu'un.
import time
from itertools import (takewhile,repeat)
def readfilesimple(myfile):
# watch me whip
linecounter = 0
with open(myfile,'r') as file_object:
# watch me nae nae
for lines in file_object:
linecounter += 1
return linecounter
def readfileadvanced(myfile):
# watch me whip
f = open(myfile, 'rb')
# watch me nae nae
bufgen = takewhile(lambda x: x, (f.raw.read(1024 * 1024) for _ in repeat(None)))
return sum(buf.count(b'\n') for buf in bufgen if buf)
#return linecounter
# ************************************
# Main
# ************************************
#start the clock
start_time = time.time()
# 6.7 seconds to read a 475MB file that has 24 million rows and 3 columns
#mycount = readfilesimple("c:/junk/book1.csv")
# 0.67 seconds to read a 475MB file that has 24 million rows and 3 columns
#mycount = readfileadvanced("c:/junk/book1.csv")
# 25.9 seconds to read a 3.9Gb file that has 3.25 million rows and 104 columns
#mycount = readfilesimple("c:/junk/WideCsvExample/ReallyWideReallyBig1.csv")
# 5.7 seconds to read a 3.9Gb file that has 3.25 million rows and 104 columns
#mycount = readfileadvanced("c:/junk/WideCsvExample/ReallyWideReallyBig1.csv")
# 292.92 seconds to read a 43Gb file that has 35.7 million rows and 104 columns
mycount = readfilesimple("c:/junk/WideCsvExample/ReallyWideReallyBig.csv")
# 57 seconds to read a 43Gb file that has 35.7 million rows and 104 columns
#mycount = readfileadvanced("c:/junk/WideCsvExample/ReallyWideReallyBig.csv")
#stop the clock
elapsed_time = time.time() - start_time
print("\nCode Execution: " + str(elapsed_time) + " seconds\n")
print("File contains: " + str(mycount) + " lines of text.")