在大文件中打印行号之间的行

时间:2014-08-06 09:40:40

标签: python python-2.7

我有一个非常大的文本文件,大小超过30 GB。出于某些原因,我想读取1000000和2000000之间的行,并与用户输入字符串进行比较。如果匹配,我需要将行内容写入另一个文件。

我知道如何逐行读取文件。

input_file = open('file.txt', 'r')
for line in input_file:
    print line

但是如果文件的大小很大,它确实会影响性能吗?如何以优化的方式解决这个问题。

6 个答案:

答案 0 :(得分:7)

您可以使用itertools.islice

from itertools import islice
with open('file.txt') as fin:
    lines = islice(fin, 1000000, 2000000) # or whatever ranges
    for line in lines:
        # do something

当然,如果你的线是固定长度的,你可以直接使用它fin.seek()到线的开头。否则,上面的方法仍然必须读取n行,直到islice开始产生输出,但这只是限制范围的一种方便的方法。

答案 1 :(得分:2)

您可以使用linecache

让我引用文档:" linecache模块允许一个人从任何文件中获取任何行,同时尝试使用缓存进行内部优化,这是从多个行读取多行的常见情况单个文件。"

import linecache

for i in xrange(1000000, 2000000)
    print linecache.getline('file.txt', i)

答案 2 :(得分:1)

你的所有线条都有相同的尺寸吗?如果是这种情况,您可以使用seek()直接跳转到您感兴趣的第一行。否则,您将不得不遍历整个文件,因为无法提前告知每行开始的位置:

input_file = open('file.txt', 'r')
for index, line in enumerate(input_file):
    # Assuming you start counting from zero
    if 1000000 <= index <= 2000000:
        print line

对于小文件,linecache模块可能很有用。

答案 3 :(得分:1)

如果您使用Linux,是否考虑过使用os.systemcommands Python模块直接执行shell命令,例如sedawk,{{ 1}}或head这样做?

运行命令:tail

将从文件os.system("tail -n+50000000 test.in | head -n10") This post on stackoverflow读取50.000.000到50.000.010行讨论调用命令的不同方法,如果性能是关键,则可能有比os.system更有效的方法。

This discussion on unix.stackexchange深入讨论了如何使用命令行选择文本文件的特定范围:

  • test.in
  • 生成的100,000,000行文件
  • 阅读行50,000,000-50,000,010
  • 没有特别顺序的测试
  • bash内置时间报告的实时时间

尾部和头部的组合,或使用sed似乎提供最快的解决方案。

seq 100000000 > test.in

答案 4 :(得分:0)

通常,你不能只跳转到文件中的第x行,因为文本行可以有变量长度,因此它们可以占用1到数千字节之间的任何内容。

但是,如果你希望经常搜索这些文件,你可以索引它们,记住在单独的文件中,字节开始,让我们说,每千分之一行。您可以打开文件并使用file.seek()转到您感兴趣的文件的一部分,然后从那里开始迭代。

答案 5 :(得分:0)

我发现的最好方式是:

lines_data = []     
text_arr = multilinetext.split('\n')
for i in range(line_number_begin, line_number_end):
    lines_data.append(multilinetext[i])