2015-11-02 116 views
2

我需要使用python中的request模塊發佈文件,該模塊在文件名中包含unicode字符。在Python中使用requests.post在文件名中使用Unicode字符發送文件

我使用下面的代碼:

url = "https://demo.php" 
headers = {'Accept': 'application/vnd.ve.v1.0+json','API': 'aasadadas'} 
file_up = {'filename': open(file_name, 'rb')} 
upload_file_rest =requests.post(url,files=file_up,headers=headers,verify=False) 

使用上面的代碼,並通過文件名是 「指事字的.exe」 的時候,我得到以下異常:

'ascii' codec can't decode byte 0xc2 in position 26: ordinal not in range(128) 

任何幫助真的很感激。

PS:我已經嘗試下面的代碼,它不工作對我來說:

file_up = {'filename': open(file_name.encode('utf-8'), 'rb')} 

回答

0

即使世界一個很好的解釋,如果你讀它會給你很多的瞭解。它看起來很長,但它真的不值得閱讀:http://nedbatchelder.com/text/unipain/unipain.html#1

但是,編碼將unicode對象轉換爲字符串對象。但是在這裏你已經在一個字符串對象上調用它了。所以Python必須首先將字符串轉換爲一個unicode對象。所以它相當於

"指事字".decode().encode('utf-8') 

但是,解碼失敗,因爲該字符串無效ascii。這就是爲什麼你會抱怨無法解碼。

0

唉,您沒有發佈堆棧跟蹤或您使用的是哪個版本的Python,因此這裏涉及到一些guessword。我的第一個假設是,異常來自嘗試打開文件的行,而不是來自請求模塊內的行。

確保你宣佈你的Python文件的第一行編碼:

# -*- coding: utf-8 -*- 

使用Unicode常量,或請確保您的字符串是unicode的:

filename = u"指事字.txt" 

之後,它應該可以打開文件。這段代碼工作在我的電腦(的MacBook,巨蟒2.7.10)上:

filename = u"指事字.txt" 
f = open(filename, "rb") 
data = f.read() 
print u"%d bytes in %s" % (len(data), filename) 

...我先創建了一個名爲指事字的.txt在當前目錄中的文件,裏面有幾行文本。

相關問題