python 中的 mmap 打印二进制数据而不是文本
mmap in python printing binary data instead of text
我正在尝试逐个字符地读取一个 30 MB 的大文件。我发现了一篇关于如何读取大文件的有趣文章。 Fast Method to Stream Big files
问题:输出打印二进制数据而不是实际的人类可读文本
代码:
def getRow(filepath):
offsets = get_offsets(filepath)
random.shuffle(offsets)
with gzip.open(filepath, "r+b") as f:
i = 0
mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
for position in offsets:
mm.seek(position)
record = mm.readline()
x = record.split(",")
yield x
def get_offsets(input_filename):
offsets = []
with open(input_filename, 'r+b') as f:
i = 0
mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
for record in iter(mm.readline, ''):
loc = mm.tell()
offsets.append(loc)
i += 1
return offsets
for line in getRow("hello.dat.gz"):
print line
输出:输出产生了一些奇怪的二进制数据。
['w\xc1\xd9S\xabP8xy\x8f\xd8\xae\xe3\xd8b&\xb6"\xbeZ\xf3P\xdc\x19&H\@\x8e\x83\x0b\x81?R\xb0\xf2\xb5\xc1\x88rJ\
我是不是在做一些非常愚蠢的事情?
编辑:
我发现了问题。这是因为gzip.open
。不知道如何摆脱这个。有什么想法吗?
根据 GZipFile
的文档:
fileno(self)
Invoke the underlying file object's `fileno()` method.
您映射的是压缩 .gz
文件的视图,而不是压缩数据的视图。
mmap()
只能操作 OS 个文件句柄,不能映射任意 Python 个文件对象。
所以不,除非底层操作系统直接支持,否则您不能透明地映射压缩文件的解压缩视图。
我正在尝试逐个字符地读取一个 30 MB 的大文件。我发现了一篇关于如何读取大文件的有趣文章。 Fast Method to Stream Big files
问题:输出打印二进制数据而不是实际的人类可读文本
代码:
def getRow(filepath):
offsets = get_offsets(filepath)
random.shuffle(offsets)
with gzip.open(filepath, "r+b") as f:
i = 0
mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
for position in offsets:
mm.seek(position)
record = mm.readline()
x = record.split(",")
yield x
def get_offsets(input_filename):
offsets = []
with open(input_filename, 'r+b') as f:
i = 0
mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
for record in iter(mm.readline, ''):
loc = mm.tell()
offsets.append(loc)
i += 1
return offsets
for line in getRow("hello.dat.gz"):
print line
输出:输出产生了一些奇怪的二进制数据。
['w\xc1\xd9S\xabP8xy\x8f\xd8\xae\xe3\xd8b&\xb6"\xbeZ\xf3P\xdc\x19&H\@\x8e\x83\x0b\x81?R\xb0\xf2\xb5\xc1\x88rJ\
我是不是在做一些非常愚蠢的事情?
编辑:
我发现了问题。这是因为gzip.open
。不知道如何摆脱这个。有什么想法吗?
根据 GZipFile
的文档:
fileno(self)
Invoke the underlying file object's `fileno()` method.
您映射的是压缩 .gz
文件的视图,而不是压缩数据的视图。
mmap()
只能操作 OS 个文件句柄,不能映射任意 Python 个文件对象。
所以不,除非底层操作系统直接支持,否则您不能透明地映射压缩文件的解压缩视图。