我需要在python中使用请求模块发布文件,文件名中包含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 :(得分:0)
唉,你没有发布堆栈跟踪或你正在使用的Python版本,所以这里有一些猜测。我的第一个假设是异常来自试图打开文件的行,而不是来自请求模块。
确保在第一行声明python文件的编码:
# -*- coding: utf-8 -*-
使用unicode常量,或确保你的字符串是unicode:
filename = u"指事字.txt"
之后,应该可以打开文件。这段代码在我的电脑上运行(Macbook,Python 2.7.10):
filename = u"指事字.txt"
f = open(filename, "rb")
data = f.read()
print u"%d bytes in %s" % (len(data), filename)
...我首先在当前目录中创建了一个名为指事字.txt的文件,其中包含一些文本行。
答案 1 :(得分:-1)
这是一个非常好的解释,如果你阅读它会给你很多理解。它看起来很长,但它真的不值得阅读:http://nedbatchelder.com/text/unipain/unipain.html#1
但是,encode将unicode对象转换为字符串对象。但是你在这里调用了一个字符串对象。所以python必须首先将字符串转换为unicode对象。所以它相当于
"指事字".decode().encode('utf-8')
但解码失败,因为字符串无效ascii。这就是为什么你得到一个关于无法解码的投诉。