以下代码是否有其他替代方法:
startFromLine = 141978 # or whatever line I need to jump to urlsfile = open(filename, "rb", 0) linesCounter = 1 for line in urlsfile: if linesCounter > startFromLine: DoSomethingWithThisLine(line) linesCounter += 1
如果我正在(~15MB)
使用未知但不同长度的行处理一个巨大的文本文件,并且需要跳转到我事先知道的特定行?当我知道我至少可以忽略文件的前半部分时,我会逐个处理它们.寻找更优雅的解决方案,如果有的话.
如果没有在文件中读取至少一次就无法跳转,因为你不知道换行的位置.你可以这样做:
# Read in the file once and build a list of line offsets line_offset = [] offset = 0 for line in file: line_offset.append(offset) offset += len(line) file.seek(0) # Now, to skip to line n (with the first line being line 0), just do file.seek(line_offset[n])
linecache:
该
linecache
模块允许从Python源文件获取任何行,同时尝试使用缓存在内部进行优化,这是从单个文件中读取许多行的常见情况.traceback
模块使用它来检索源行以包含在格式化的回溯中...
如果线条的长度不同,你真的没有那么多的选项...你可能需要处理行结束字符以了解你何时进展到下一行.
但是,您可以通过将最后一个参数更改为"打开"到非0的内容来显着提高速度并减少内存使用量.
0表示文件读取操作是无缓冲的,这非常慢并且磁盘密集.1表示文件是行缓冲的,这将是一种改进.大于1的任何东西(比如8k ......即:8096或更高)将文件的块读取到内存中.你仍然可以访问它for line in open(etc):
,但是python一次只能进行一些操作,在处理后丢弃每个缓冲的块.
我可能被丰富的公羊宠坏了,但15米并不大.读入内存readlines()
是我通常使用这种大小的文件.之后访问一条线是微不足道的.
由于没有阅读前无法确定所有行的长度,因此您别无选择,只能在开始行之前遍历所有行。您所要做的就是使它看起来不错。如果文件确实很大,那么您可能要使用基于生成器的方法:
from itertools import dropwhile def iterate_from_line(f, start_from_line): return (l for i, l in dropwhile(lambda x: x[0] < start_from_line, enumerate(f))) for line in iterate_from_line(open(filename, "r", 0), 141978): DoSomethingWithThisLine(line)
注意:此方法的索引为零。
我很惊讶没有人提到伊丽丝
line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
或者如果您想要整个文件的其余部分
rest_of_file = itertools.islice(Fhandle,index_of_interest) for line in rest_of_file: print line
或者如果您想要文件中的其他所有行
rest_of_file = itertools.islice(Fhandle,index_of_interest,None,2) for odd_line in rest_of_file: print odd_line