我找到了2种计算文件行的方法,如下所示。 (注意:我需要整个文件而不是逐行阅读)
尝试了解哪种方法在效率和/或良好编码风格方面更好。
names = {}
for each_file in glob.glob('*.cpp'):
with open(each_file) as f:
names[each_file] = sum(1 for line in f if line.strip())
(见here)
data = open('test.cpp', 'r').read()
print(len(data.splitlines()), len(data.split()), len(data))
(见here)
在同一主题中,关于文件中计算字符数和计算字数;有没有比上面建议更好的方式?
答案 0 :(得分:6)
使用生成器表达式来提高内存效率(这种方法可以避免将整个文件读入内存)。这是一个演示。
def count(filename, what):
strategy = {'lines': lambda x: bool(x.strip()),
'words': lambda x: len(x.split()),
'chars': len
}
strat = strategy[what]
with open(filename) as f:
return sum(strat(line) for line in f)
input.txt中:
this is
a test file
i just typed
输出:
>>> count('input.txt', 'lines')
3
>>> count('input.txt', 'words')
8
>>> count('input.txt', 'chars')
33
请注意,计算字符时,也会计算换行符。还要注意,这使用了一个非常原始的“word”定义(你没有提供一个),它只是按空格分割一行,并计算返回列表的元素。
答案 1 :(得分:4)
创建一些测试文件并在大循环中测试它们以查看平均时间。 确保测试文件适合您的场景。
我使用了这段代码:
import glob
import time
times1 = []
for i in range(0,1000):
names = {}
t0 = time.clock()
with open("lines.txt") as f:
names["lines.txt"] = sum(1 for line in f if line.strip())
print names
times1.append(time.clock()-t0)
times2 = []
for i in range(0,1000):
names = {}
t0 = time.clock()
data = open("lines.txt", 'r').read()
print("lines.txt",len(data.splitlines()), len(data.split()), len(data))
times2.append(time.clock()-t0)
print sum(times1)/len(times1)
print sum(times2)/len(times2)
并提出了平均时间: 0.0104755582104和 0.0180650466201秒
这是一个包含23000行的文本文件。 E.g:
print("lines.txt",len(data.splitlines()), len(data.split()), len(data))
输出:(' lines.txt',23056,161392,1095160)
在您的实际文件集上进行测试,以获得更准确的计时数据。