我有一个非常大的文本文件,大小超过30 GB。出于某些原因,我想读取1000000和2000000之间的行,并与用户输入字符串进行比较。如果匹配,我需要将行内容写入另一个文件。
我知道如何逐行读取文件。
input_file = open('file.txt', 'r')
for line in input_file:
print line
但是如果文件的大小很大,它确实会影响性能吗?如何以优化的方式解决这个问题。
答案 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.system
或commands
Python模块直接执行shell命令,例如sed
,awk
,{{ 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
尾部和头部的组合,或使用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])