2015-11-02 125 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在当前目录中的文件,里面有几行文本。

相关问题