在python中使用bz2.decompress,但答案不同

时间:2014-12-16 11:25:46

标签: python bzip2 compression

我有一个这样的字符串:

un: 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
pw: 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'

这是我的代码:

un = re.search(r"un: '(.+)'",page).group(1)
bz2.decompress(un)

然后我使用bz2.decompress方法,它返回错误:

IOError: invalid data stream

我试试这个:

un = 'BZh91...\x084'
bz2.decompress(un)

并返回正确答案。

补充:这是我的完整代码。

#!/usr/bin/env python
import urllib
import re 
import bz2

def main():
    page=urllib.urlopen("http://www.pythonchallenge.com/pc/def/integrity.html").read()
    unstring = re.search(r"un: *'(.+)'",page).group(1)
    print unstring
    un = "BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"
    #the string un is copied from output of 'print unstring'
    print bz2.decompress (un)
    print bz2.decompress (unstring)
if (__name__=="__main__"):
    main()

这是输出:

==== No Subprocess ====
>>> 
BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084
huge
Traceback (most recent call last):
  File "/home/terry/pythonchallage/pythonchallenge_8.py", line 16, in <module>
    main()
  File "/home/terry/pythonchallage/pythonchallenge_8.py", line 14, in main
    print bz2.decompress (unstring)
IOError: invalid data stream
>>> 

2 个答案:

答案 0 :(得分:1)

你有字符串文字,其中每个\xhh值是4个字面字符,而不是字节转义。

如果是这样,您首先需要告诉Python解释这些:

bz2.decompress(un.decode('string_escape'))

演示:

>>> unstring = r'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>> print unstring
BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084
>>> unstring
'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'
>>> import bz2
>>> bz2.decompress(unstring)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: invalid data stream
>>> bz2.decompress(unstring.decode('string_escape'))
'huge'

答案 1 :(得分:1)

正如Martijn指出的那样,数据实际上是无效的,所以它不会解压缩。

除此之外,假设您的问题中没有拼写错误,另一个潜在的问题是:您的正则表达式模式期望在un:之后有一个空格,但您的示例字符串中没有这样的空格。您可以将正则表达式更改为r"un: *'(.+)'",这样可以在:'之间留出零个或多个空格。