Python:高效文件输入输出

1 投票
4 回答
2624 浏览
提问于 2025-04-17 05:50

同时读取两个大文件并进行处理,最有效(最快)的方法是什么?

我有两个文件:a.txt 和 b.txt,每个文件大约有十万行对应的内容。我的目标是读取这两个文件,然后对每一对行进行处理。

def kernel:
    a_file=open('a.txt','r')
    b_file=open('b.txt', 'r')
    a_line = a_file.readline()
    b_line = b_file.readline()
    while a_line:
        process(a_spl,b_spl) #process requiring both corresponding file lines

我查了一下 xreadlines 和 readlines,但我在想是否还有更好的方法。速度对这个任务来说非常重要。

谢谢。

4 个回答

1

字符串输入输出可以非常快——可能是你的处理过程让速度变慢了。想象一下一个简单的输入循环,用来把数据放进一个队列,像这样:

queue = multiprocessing.Queue(100)
a_file = open('a.txt')
b_file = open('b.txt')
for pair in itertools.izip(a_file, b_file):
     queue.put(pair) # blocks here on full queue

你可以建立一个进程池,从队列中取出项目并对每个项目进行处理,前提是你的问题可以这样并行处理。

1

你可以使用 with 语句来确保在执行完操作后,文件会被自动关闭。来自 这个博客 的内容:

如果你想打开一个文件,处理它的内容,并确保最后关闭它,你可以简单地这样做:

with open("x.txt") as f:
    data = f.read()
    do something with data
2

下面的代码不会把输入文件中的数据存储到内存里,除非process函数自己去做这件事。

from itertools import izip

def process(line1, line2):
  # process a line from each input

with open(file1, 'r') as f1:
  with open(file2, 'r') as f2:
    for a, b in izip(f1, f2):
      process(a, b)

如果process函数运行得很高效,这段代码在大多数情况下应该能快速执行。for循环会在其中一个文件结束时停止。如果任意一个文件里有特别长的行(比如XML或JSON格式),或者文件不是文本格式,这段代码可能就不太好用了。

撰写回答