如何使用python计算文本文件中的总行数

时间:2013-09-25 09:42:01

标签: python file file-io sum

例如,如果我的文本文件是:

blue
green
yellow
black

这里有四行,现在我想把结果变成四行。我怎么能这样做?

11 个答案:

答案 0 :(得分:48)

您可以将sum()与生成器表达式一起使用:

with open('data.txt') as f:
    print sum(1 for _ in f)

请注意,您无法使用len(f),因为fiterator_是一次性变量的特殊变量名称,请参阅What is the purpose of the single underscore "_" variable in Python?

您可以使用len(f.readlines()),但这会在内存中创建一个额外的列表,甚至不适用于不适合内存的大文件。

答案 1 :(得分:20)

这个链接(How to get line count cheaply in Python?)有很多潜在的解决方案,但它们都忽略了一种方法,使得这个运行速度更快,即使用无缓冲(原始)接口,使用bytearrays,并进行自己的缓冲。

使用修改版的计时工具,我相信以下代码比任何提供的解决方案更快(并且更加pythonic):

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 )

以下是我的时间:

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

我会把它发布在那里,但我是一个相对较新的用户来进行堆叠交换并且没有必要的吗哪。

编辑:

这可以使用itertools在线生成器表达式完全完成,但看起来非常奇怪:

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 )

答案 2 :(得分:8)

您可以在此处使用sum()生成器表达式。生成器表达式将为[1, 1, ...],直到文件的长度。然后我们调用sum()将它们全部加在一起,以获得总计数。

with open('text.txt') as myfile:
    count = sum(1 for line in myfile)

您尝试过的似乎并不想包含空行。然后你可以这样做:

with open('text.txt') as myfile:
    count = sum(1 for line in myfile if line.rstrip('\n'))

答案 3 :(得分:5)

count=0
with open ('filename.txt','rb') as f:
    for line in f:
        count+=1

print count

答案 4 :(得分:2)

一个班轮:

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

print(total_line_count)

答案 5 :(得分:0)

这个也给出了文件中的no.of行。

a=open('filename.txt','r')
l=a.read()
count=l.splitlines()
print(len(count))

答案 6 :(得分:0)

使用:

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

这将有效。

答案 7 :(得分:0)

对于说要使用with open ("filename.txt","r") as f的人,您可以anyname = open("filename.txt","r")

def main():

    file = open("infile.txt",'r')
    count = 0
    for line in file:
            count+=1

    print (count)

main ()

答案 8 :(得分:0)

这里是你如何通过列表理解来实现的,但这会浪费你的计算机内存,因为line.strip()被调用了两次。

     with open('textfile.txt') as file:
lines =[
            line.strip()
            for line in file
             if line.strip() != '']
print("number of lines =  {}".format(len(lines)))

答案 9 :(得分:0)

我对stackoverflow并不陌生,只是从来没有一个帐户,通常来这里寻求答案。我还不能发表评论或投票。但是,我想说上面迈克尔·培根(Michael Bacon)的代码效果很好。我是Python的新手,但不是编程的人。我一直在阅读《 Python速成班》,我想做一些事情来打破阅读的封面。从ETL甚至数据质量的角度来看,使用的一种实用工具是独立于任何ETL捕获文件的行数。该文件的行数为X,您将其导入SQL或Hadoop,最后得到的行数为X。您可以在最低级别验证原始数据文件的行数。

我一直在研究他的代码,并进行了一些测试,到目前为止,该代码非常有效。我创建了几个不同的CSV文件,各种大小和行数。您可以在下面看到我的代码,我的注释提供了时间和详细信息。上面提供的迈克尔·培根(Michael Bacon)代码比普通的循环运行Python方法快6倍。

希望这对某人有帮助。


答案 10 :(得分:0)

如果导入pandas,则可以使用shape函数来确定。不知道它的性能如何。代码如下:

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