使用python

时间:2015-11-02 06:37:22

标签: python character-encoding request python-unicode

我需要在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')}

2 个答案:

答案 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。这就是为什么你得到一个关于无法解码的投诉。