如何以低廉的价格在Python中获取大文件的行数

1289
如何以最节省内存和时间的方式获取大文件的行数?
def file_len(filename):
    with open(filename) as f:
        for i, _ in enumerate(f):
            pass
    return i + 1

16
您需要精确的行数还是近似值就可以了? - pico
61
由于此代码无法处理空文件,因此我建议在for循环之前添加i = -1。 - Maciek Sawicki
14
@Legend: 我敢打赌Pico正在考虑使用seek(0,2)或相似函数获取文件大小,然后将文件大小除以大约的行长度来计算。你可以读取开始几行来猜测平均行长度。 - Anne
41
enumerate(f, 1) 代替 range(len(f)) 并省略 i + 1 - Ian Mackinnon
6
适用于空文件,但在 for 循环之前必须将 i 初始化为 0 - scai
显示剩余6条评论
45个回答

-1

同样地:

lines = 0
with open(path) as f:
    for line in f:
        lines += 1

-1
def line_count(path):
    count = 0
    with open(path) as lines:
        for count, l in enumerate(lines, start=1):
            pass
    return count

1
除了初始的 count = 0 可以作为注释之外,这与最初的问题有何不同? - Jean-Francois T.

-1

count = max(enumerate(open(filename)))[0]

计数 = max(enumerate(open(filename)))[0]


1
这将给出真值的计数-1。 - Borealis
enumerate() 的可选第二个参数是起始计数,参考 https://docs.python.org/2/library/functions.html#enumerate - MarkHu

-3

这个怎么样?

import sys
sys.stdin=open('fname','r')
data=sys.stdin.readlines()
print "counted",len(data),"lines"

3
我认为它并没有解决大文件被读入内存的问题。 - SilentGhost
打印“counted”,len(data),”lines” ^ 语法错误:无效的语法 - dave

-3
为什么下面的代码不起作用?
import sys

# input comes from STDIN
file = sys.stdin
data = file.readlines()

# get total number of lines in file
lines = len(data)

print lines

在这种情况下,len函数使用输入行作为确定长度的手段。

6
问题不在于如何获取行数,在问题本身中我已经展示了我在做什么:问题是如何高效地完成这个任务。在你的解决方案中,整个文件都被读入内存,对于大文件来说至少是低效的,对于巨大的文件来说则是不可能的。 - SilentGhost
2
其实,它很可能非常高效,除非它是不可能的。 :-) - kindall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接