2016-12-01 43 views
1

我寫了一個httpserver來爲python2.7和python3.5提供html文件。python3將str轉換爲字節式的obj而不使用編碼

def do_GET(self): 

    ... 
    #if resoure is api 
     data = json.dumps({'message':['thanks for your answer']}) 

    #if resource is file name 
     with open(resource, 'rb') as f: 
      data = f.read() 

    self.send_response(response) 
    self.send_header('Access-Control-Allow-Origin', '*') 
    self.end_headers() 
    self.wfile.write(data) # this line raise TypeError: a bytes-like object is required, not 'str' 

該代碼在python2.7中工作,但在python 3中,它引發了上述錯誤。

我可以使用bytearray(data, 'utf-8')將str轉換爲字節,但html在web中更改。

enter image description here

我的問題: 怎麼做才能支持python2和python3不使用2to3的工具和不改變文件的編碼。

有沒有更好的方式來讀取文件,並在python2和python3中以相同的方式將內容發送到客戶端?

在此先感謝。

回答

1

你只需要在二進制模式文本打開你的文件,而不是模式:

with open(resource,"rb") as f: 
    data = f.read() 

然後,data在Python 3 bytes對象,並在蟒蛇2 str,並它適用於兩個版本。

作爲一個積極的副作用,當此代碼點擊Windows框時,它仍然有效(否則像圖像這樣的二進制文件由於在文本模式下打開時進行了結束符終止轉換而被破壞)。

+0

你的意思是在Python 3中。在這種情況下,僅在python中將返回值轉換爲'bytes(return_value,「ascii」)「。3.用'if if sys.version_info> =(3,):' –

+0

謝謝。:-)測試版本, –

相關問題