【发布时间】:2013-10-11 23:13:29
【问题描述】:
我在一个文件中有一个 ASCII 表,我想从中读取一组特定的行(例如第 4003 到 4005 行)。问题是这个文件可能非常长(例如,几千到几百万行),我想尽快完成。
不好的解决方案:读入整个文件,然后转到那些行,
f = open('filename')
lines = f.readlines()[4003:4005]
更好的解决方案:enumerate 在每一行上,这样它就不会全部在内存中(a lahttps://stackoverflow.com/a/2081880/230468)
f = open('filename')
lines = []
for i, line in enumerate(f):
if i >= 4003 and i <= 4005: lines.append(line)
if i > 4005: break # @Wooble
最佳解决方案?
但这仍然需要遍历每一行。是否有更好的(在速度/效率方面)访问特定线路的方法?即使我只会访问一次文件(通常),我是否应该使用linecache?
使用二进制文件代替,在这种情况下可能更容易跳过,是一种选择 --- 但我宁愿避免它。
【问题讨论】:
-
你更好的解决方案是好的,但是在第 4005 行之后
break;无需继续阅读文件的其余部分。 -
如果你知道每行的长度,你可以做一个搜索
-
在这里看看解决方案:stackoverflow.com/a/620492/2770712
-
如果文件的行有一个已知的长度,你可以很容易地找到你的 #4003 行
标签: python performance file io