web-dev-qa-db-fra.com

comment compter le nombre total de lignes dans un fichier texte en utilisant python

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?

22
user2794146

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.

45
alecxe

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 )
19
Michael Bacon

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'))
8
TerryA
count=0
with open ('filename.txt','rb') as f:
    for line in f:
        count+=1

print count
5
Koustav Ghosal

Bon mot:

total_line_count = sum(1 for line in open("filename.txt"))

print(total_line_count)
2
Surya

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)))
0
Amaan

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))
0
Naveen

Utilisation: 

num_lines = sum(1 for line in open('data.txt'))
print(num_lines)

Ça marchera.

0
Tiebe Groosman

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 ()
0
Michell

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
0
Brian Seborg

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.")
0
Steven Johnson