当前位置:  开发笔记 > 编程语言 > 正文

如何跳转到一个巨大的文本文件中的特定行?

如何解决《如何跳转到一个巨大的文本文件中的特定行?》经验,为你挑选了6个好方法。

以下代码是否有其他替代方法:

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)使用未知但不同长度的行处理一个巨大的文本文件,并且需要跳转到我事先知道的特定行?当我知道我至少可以忽略文件的前半部分时,我会逐个处理它们.寻找更优雅的解决方案,如果有的话.



1> Adam Rosenfi..:

如果没有在文件中读取至少一次就无法跳转,因为你不知道换行的位置.你可以这样做:

# 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])


有一点需要注意(特别是在Windows上):小心以二进制模式打开文件,或者使用offset = file.tell().在Windows上的文本模式下,该行将比磁盘上的原始长度短一个字节(\ r \n由\n替换)
+1:此外,如果文件没有改变,行号索引可以被腌制和重复使用,进一步摊销扫描文件的初始成本.
+1,但要注意这只有在他要跳到几个随机行时才有用!但如果他只跳到一条线,那就浪费了
@photographer:使用read()或readline(),它们从seek设置的当前位置开始.

2> John Ellinwo..:

linecache:

linecache模块允许从Python源文件获取任何行,同时尝试使用缓存在内部进行优化,这是从单个文件中读取许多行的常见情况.traceback模块使用它来检索源行以包含在格式化的回溯中...


我刚检查了这个模块的源代码:整个文件在内存中读取!因此,为了快速访问文件中的给定行,我肯定会将此答案排除在外.
尝试100G文件,很糟糕.我必须使用f.tell(),f.seek(),f.readline()
你的操作系统的虚拟内存管理器有很多帮助,所以如果你没有产生大量的页面错误,那么将大文件读入内存可能不会很慢:)相反,这样做是"愚蠢的方式"并分配了很多和很多记忆力可以非常快.我很喜欢丹麦FreeBSD开发人员Poul-Henning Kamp关于它的文章:https://queue.acm.org/detail.cfm?id = 1814327

3> Jarret Hardi..:

如果线条的长度不同,你真的没有那么多的选项...你可能需要处理行结束字符以了解你何时进展到下一行.

但是,您可以通过将最后一个参数更改为"打开"到非0的内容来显着提高速度并减少内存使用量.

0表示文件读取操作是无缓冲的,这非常慢并且磁盘密集.1表示文件是行缓冲的,这将是一种改进.大于1的任何东西(比如8k ......即:8096或更高)将文件的块读取到内存中.你仍然可以访问它for line in open(etc):,但是python一次只能进行一些操作,在处理后丢弃每个缓冲的块.


8K是8192,或许最好写8 << 10是安全的.:)

4> SilentGhost..:

我可能被丰富的公羊宠坏了,但15米并不大.读入内存readlines() 是我通常使用这种大小的文件.之后访问一条线是微不足道的.


嗯,如果是1GB文件怎么办?

5> 小智..:

由于没有阅读前无法确定所有行的长度,因此您别无选择,只能在开始行之前遍历所有行。您所要做的就是使它看起来不错。如果文件确实很大,那么您可能要使用基于生成器的方法:

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)

注意:此方法的索引为零。



6> Joran Beasle..:

我很惊讶没有人提到伊丽丝

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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有