2013-12-23 40 views
1

我正在學習使用python3.3的python挑戰python,我在question eight。標記中有一個註釋,它提供了兩個輸出字節字符串的bz2壓縮的unicode字符串,一個用於用戶名,一個用於輸入密碼。還有一個鏈接,您需要輸入解壓縮的憑據。 一種方法輕鬆解決這僅僅是手動複製的字符串,並將其分配給兩個變量作爲字節串,然後只用了BZ2庫來解壓:Unicode字符串到字節字符串,而不添加反斜槓

>>>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' 
>>>print(bz2.decompress(un).decode('utf-8')) 
huge 

但是,這不適合我,因爲我想要的通過運行我的python文件來回答。 我這樣的代碼:

>>>import bz2, re, requests 

>>>url = requests.get('http://www.pythonchallenge.com/pc/def/integrity.html') 
>>>un = re.findall(r'un: \'(.*)\'',url.text)[0] 
>>>correct=b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084' 
>>>print(un,un is correct,sep='\n') 
b'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084' 
False 

的問題是,當它從unicode字符串轉換成字節串被添加的轉義反斜線,使其不能被BZ2模塊讀取。我已經嘗試了我所知道的一切,以及當我搜索時起牀的事情。

如何從unicode獲取它到字節,以便它不會被更改?

+1

我還在測試,看看這是你實際的錯誤,但'is'不正確的操作,看看你是否已經正確地檢索到的內容。 '是'測試對象相等,而不是語義相等。 –

+0

謝謝你的時間,你有什麼想法嗎?看來,它是不可能刪除或替換其中一個斜槓,我不知道如何分配一個Unicode字符串作爲字節字符串,而無需轉換它。感謝您對「is」陳述的評論。 – Jayus

回答

0

反斜槓存在於HTML源代碼中,所以requests模塊保留它們並不奇怪。我沒有在我的Python 3環境中安裝requests,所以我一直無法完全複製您的情況,但在我看來,如果您開始捕獲周圍的'字符,則可以使用ast.literal_eval解析字符序列成字節數組:

>>> test 
"'BZh91AY&SYA\\xaf\\x82\\r\\x00\\x00\\x01\\x01\\x80\\x02\\xc0\\x02\\x00 \\x00!\\x9ah3M\\x07<]\\xc9\\x14\\xe1BA\\x06\\xbe\\x084'" 
>>> import ast 
>>> res = ast.literal_eval("b%s" % test) 
>>> import bz2 
>>> len(bz2.decompress(res)) 
4 

可能有其他的方法,但爲什麼不使用Python內置知識的字節序列b'\\xaf'可以被解析成一個字節數組?

+0

使用'request'和'urllib.request'庫有相同的結果,所以問題是真的,我該如何從字符串中移除轉義反斜槓。你回答了這個問題,以及我本可以期待的!這是一個非常方便的工具,它是我沒有偶然發現的'ast.literal_eval()',直到現在。謝謝!我想我知道這個輸入是如何工作的,但我不確定爲什麼我需要額外的'''在我的字符串周圍,你會不會介意我?再次感謝! (因爲我是新手,所以我無法贊成) – Jayus

+1

這有點複雜 - 在開始工作之前,我必須自己完成幾個版本。基本上,'literal_eval'的參數需要是可以輸入Python提示或放入源代碼的意義。但是你仍然必須在源代碼中使它有意義,所以你需要(鬆散地說)一個額外的文字編碼層。您需要將字符串對象提供給'literal_eval',它本身表示一個字符串對象。 ''b%s「%test'評估爲''b'BZh ...'」',這本身就是一個表示字節數組'b'BZh ...''的文字。 –

0

這是一個solution

import urllib 
import bz2 
import re 

def decode(line): 
    out = re.search(r"\'(.*?)\'",''.join(line)).group() 
    out = eval("b%s" % out) 
    return bz2.decompress(out) 

#read lines that contain the encoded message 
page = urllib.urlopen('http://www.pythonchallenge.com/pc/def/integrity.html').readlines()[20:22] 

print "Click on the bee and insert: " 
User_Name = decode(page[0]) 
print "User Name is: " + User_Name 
Password = decode(page[1]) 
print "Password is: " + Password