Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的mmap打印二进制数据而不是文本_Python_File_Gzip_Mmap_Bigdata - Fatal编程技术网

python中的mmap打印二进制数据而不是文本

python中的mmap打印二进制数据而不是文本,python,file,gzip,mmap,bigdata,Python,File,Gzip,Mmap,Bigdata,我正试图一个字符一个字符地读取一个30 MB的大文件。我发现了一篇关于如何阅读大文件的有趣文章 问题:输出打印二进制数据,而不是实际的人类可读文本 代码: 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,

我正试图一个字符一个字符地读取一个30 MB的大文件。我发现了一篇关于如何阅读大文件的有趣文章

问题:输出打印二进制数据,而不是实际的人类可读文本

代码:

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\
我在做一些非常愚蠢的事吗

编辑:

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

我发现了问题。这是因为
gzip.open
。我不知道怎么摆脱这个。有什么想法吗?

根据
gzip文件的文档:

fileno(self)

您映射的是压缩的
.gz
文件的视图,而不是压缩数据的视图

mmap()
只能在OS文件句柄上操作,不能映射任意Python文件对象


因此,除非底层操作系统直接支持,否则无法透明地映射压缩文件的解压缩视图。

谢谢您的输入。我正试图相应地修改我的方法。