2014-12-24 7 views
0

Есть аналогичные ошибки, но я не смог найти решение для bz2.bz2 распаковать с Python 3.4 - TypeError: 'str' не поддерживает интерфейс буфера

Следующая программа не на декомпрессия:

import bz2 

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' 
decoded_un = bz2.decompress(un) 
decoded_pw = bz2.decompress(pw) 

print(decoded_un) 
print(decoded_pw) 

Я попытался с помощью bytes(un, 'UTF-8), но это не будет работать. Я думаю, что у меня не было этой проблемы в Python 3.3.

EDIT: это было для вызова Python У меня есть два бита кода, которые работают благодаря Martijn:

import bz2 

un_saved = 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' 
pw_saved = 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08' 
print(bz2.decompress(un_saved.encode('latin1'))) 
print(bz2.decompress(pw_saved.encode('latin1'))) 

Это один работает с веб-страницы:

# http://www.pythonchallenge.com/pc/def/integrity.html 

import urllib.request 
import re 
import os.path 
import bz2 

fname = "008.html" 

if not os.path.isfile(fname): 
    url = 'http://www.pythonchallenge.com/pc/def/integrity.html' 
    response = urllib.request.urlopen(url) 
    webpage = response.read().decode("utf-8") 
    with open(fname, "w") as fh: 
     fh.write(webpage) 

with open(fname, "r") as fh: 
    webpage = fh.read() 
    re_un = '\\nun: \'(.*)\'\\n' 
    m = re.search(re_un, webpage) 
    un = m.group(1) 
    print(un) 

    pw_un = '\\npw: \'(.*)\'\\n' 
    m = re.search(pw_un, webpage) 
    pw = m.group(1) 
    print(pw) 

    unde = un.encode('latin-1').decode('unicode_escape').encode('latin1') 
    pwde = pw.encode('latin-1').decode('unicode_escape').encode('latin1') 
    decoded_un = bz2.decompress(unde) 
    decoded_pw = bz2.decompress(pwde) 

    print(decoded_un) 
    print(decoded_pw) 

ответ

1

В bz2 библиотека сделок с bytes объекты, не строки:

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

Другими словами, использование bytes() работает очень хорошо, просто убедитесь, что вы используете правильную кодировку. UTF-8 - это не кодирование; если у вас есть маскирование байтов в качестве символьных кодов символов, используйте Latin-1 для кодирования; Latin 1 отображает символы один на один к байтам:

un = un.encode('latin1') 

или

un = bytes(un, 'latin1') 

см Также Python Unicode HOWTO:

Latin-1, also known as ISO-8859-1, is a similar encoding. Unicode code points 0–255 are identical to the Latin-1 values, so converting to this encoding simply requires converting code points to byte values; if a code point larger than 255 is encountered, the string can’t be encoded into Latin-1.

Я оставлю расшифровку вам. Получайте удовольствие от Python Challenge!

Обратите внимание, что если вы загрузили эти символы как они с веб-страницы, они будут не от готовых байтов! Вы будете иметь символы '\', 'x', 8 и 2, а не с шестигранной элемент кода значением 82. Вы должны были бы интерпретировать эти последовательности в виде строки Python буквальной первая:

>>> un = r'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' 
>>> un 
'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084' 
>>> un.encode('latin-1').decode('unicode_escape') 
'BZh91AY&SYA¯\x82\r\x00\x00\x01\x01\x80\x02À\x02\x00 \x00!\x9ah3M\x07<]É\x14áBA\x06¾\x084' 
>>> un.encode('latin-1').decode('unicode_escape').encode('latin1') 
b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' 

Обратите внимание на двойных обратных косые в представлении un. Только последний результат bytes затем распадается!

+0

У вас есть ссылка, которую я мог бы использовать для понимания различной кодировки? Я действительно борюсь с этим ... Это было для Python Challenge ... – BlueTrin

+0

@BlueTrin: Да, я узнал струны. Не уверен, что у меня есть ссылка для вас, но учтите, что проблема была написана для Python 2, прежде чем Python 3 стал основным. –

+0

http://www.joelonsoftware.com/articles/Unicode.html http://farmdev.com/talks/unicode/ –