如何在Python中使用mmap实现文件读行



PythonFile readlines()方法返回文件中的所有行,作为列表,其中每行是列表对象中的一个项。

作为示例,这里f.readlines()返回一个列表。

f = open("file.txt", "r")
print(f.readlines())

如何使用Pythonmmap实现等价的file.readlines()等价?

我必须将所有行作为一个列表读取,而不是从文件中读取单行。

这是我到目前为止所尝试的基于如何从映射文件中读取行?

lines = []
with open(path, "rt", encoding="utf-8") as f:
m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
while True:
line = m.readline()
lines.append(line)
if line == "":
break
print(line)
m.close()

然而,这段代码永远迭代,不能像预期的那样工作。

x,mmap对象.readline()的返回值是bytes对象,所以您需要检查输入的结束:

if line == b"":

由于你的代码正在检查字符串("",这是Python 2.x中的返回值),它会无限循环。

请注意,您必须使用.decode()转换每行,以获得使用f.readline()获得的等效值。

更正代码:

lines = []
with open(path, "rt", encoding="utf-8") as f:
m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
while True:
line = m.readline()
if line != b"":
lines.append(line.decode("utf-8"))
if line == b"":
break
m.close()

更新代码:

lines = []
with open(path, "rb", buffering=0) as f:
m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
while True:
line = m.readline()
if line:
lines.append(line.decode("utf-8"))
else:
break
m.close()

使用python 3.9的最终更新代码:

lines = []
with open(path, "rb", buffering=0) as f:
m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
m.madvise(mmap.MADV_SEQUENTIAL)
while True:
line = m.readline()
if line:
lines.append(line.decode("utf-8"))
else:
break
m.close()

最新更新