Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 3.x 使用bz2.bz2压力机_Python 3.x_Compression - Fatal编程技术网

Python 3.x 使用bz2.bz2压力机

Python 3.x 使用bz2.bz2压力机,python-3.x,compression,Python 3.x,Compression,我在Windows10上运行Python3.6.4,秋季创建者更新。我正在尝试解压缩Wikimedia数据转储文件,尤其是 此文件在命令行上使用7z解压时没有问题,但在Python解压器输出的第一个长度为零的数据块上失败。守则如下: import bz2 def decompression(qin, # Iterable supplying input bytes data qout): # Pip

我在Windows10上运行Python3.6.4,秋季创建者更新。我正在尝试解压缩Wikimedia数据转储文件,尤其是

此文件在命令行上使用
7z
解压时没有问题,但在Python解压器输出的第一个长度为零的数据块上失败。守则如下:

import bz2

def decompression(qin,                 # Iterable supplying input bytes data
                  qout):               # Pipe to next process - needs bytes data
    decomp = bz2.BZ2Decompressor()     # Create a decompressor
    for chunk in qin:                  # Loop obtaining data from source iterable
        lc = len(chunk)                # = 16384
        dc = decomp.decompress(chunk)  # Do the decompression
        ldc = len(dc)                  # = 0
        qout.put(dc)                   # Pass the decompressed chunk to the next process
我已经验证了bz2头文件是有效的,并且由于使用命令行实用程序解压文件时没有问题,所以问题似乎与bz2的Python实现有关。以下来自解压器的值看起来正常,并且与给定文档的预期值相匹配

eof = False
unused_data = b''
needs_input = True

关于如何解决这个问题,有什么建议吗?

让我不知所措。我没发现你的功能有什么问题。以下内容适用于链接的.bz2文件,没有问题,其中输出与该.bz2文件的命令行解压缩结果完全匹配:

import sys
import bz2

def decompression(qin,                 # Iterable supplying input bytes data
                  qout):               # Pipe to next process - needs bytes data
    decomp = bz2.BZ2Decompressor()     # Create a decompressor
    for chunk in qin:                  # Loop obtaining data from source iterable
        lc = len(chunk)                # = 16384
        dc = decomp.decompress(chunk)  # Do the decompression
        # qout.put(dc)                   # Pass the decompressed chunk to the next process
        qout.write(dc)

with open('enwiktionary-latest-pages-meta-current.xml.bz2', 'rb') as f:
    it = iter(lambda: f.read(16384), b'')
    decompression(it, sys.stdout.buffer)
为了将结果写入stdout,我只对您的函数做了一个微小的更改。我正在使用Python 3.6.4。我还用Python2.7.10尝试了它(删除了
.buffer
),它再次完美地工作了

你真的只是让你的函数运行吗?你说的“第一个街区失败”是什么意思?前几个调用(本例中为七个)实际上不会返回任何解压缩数据,因为您还没有为它提供完整的块。但没有报告任何错误


注意:要对包含串联bzip2流的.bz2文件执行此操作,您需要在
eof
true上循环,创建一个新的解压缩器对象,并从以前的解压缩器对象中输入
未使用的_数据,然后从压缩文件中读取更多数据。链接的文件不是其中之一。

读取文件时是否使用
“rb”
模式?在Windows计算机上,二进制文件会因行尾转换而损坏,除非采取特殊措施防止这种情况发生。@MarkAdler是的,我是。我应该注意什么?否则,代码就没有问题了。我用链接的.bz2文件试过了,效果很好。您可能需要检查iterable。@MarkAdler我已经尝试过直接从Internet获取数据和从本地文件读取数据。在这两种情况下,它在第一次调用解压时都失败。不管传递的数据块是大的-64K还是小的-265字节,它都会失败。我尝试将Python升级到3.6.5,得到了相同的结果。我的意思是,第一次调用解压缩的输出是一个零长度的字节字符串,对我来说没有任何意义,除非(我刚刚想到这个)它代表4字节的bz2头。我试着让它运行,但每次调用解压都会产生一个零长度的字节字符串。你说得对。我只是没有预料到我看到的行为,因为我不知道解压器需要的缓冲区大小。我借此机会将缓冲区大小提高到128K,它运行良好。16K缓冲区也可以正常工作。并不是每个调用都返回零输出。只有前七个调用返回零输出。第八个调用返回一个bunch。这是什么
lc