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()