Python HttpConnection请求编码错误

Python HttpConnection请求编码错误,python,Python,我正在尝试使用python脚本将zip文件上载到站点。该网站提供了一个API,正是出于这个目的。但是,当我尝试使用它时,在httplib连接请求中连接要发送的所有字符串时出现了编码错误。我已经追踪到有问题的字符串是filedata(我的zip文件) 编辑:根据要求,输入完整代码 EDIT2:根据建议,尝试将所有非ascii字符串编码为ascii。它抛出了相同的错误,但现在是L[i]=value.encode(“ascii”) 它似乎包含一些unicode字符串。我应该全部编码吗?很可能ISO-

我正在尝试使用python脚本将zip文件上载到站点。该网站提供了一个API,正是出于这个目的。但是,当我尝试使用它时,在httplib连接请求中连接要发送的所有字符串时出现了编码错误。我已经追踪到有问题的字符串是
filedata
(我的zip文件)


编辑:根据要求,输入完整代码

EDIT2:根据建议,尝试将所有非ascii字符串编码为ascii。它抛出了相同的错误,但现在是
L[i]=value.encode(“ascii”)


它似乎包含一些unicode字符串。我应该全部编码吗?

很可能ISO-8859-1不是解决您第一个问题的方法。您需要知道,
任何随机的乱码解码('ISO-8859-1')
都不会失败

其次,我不确定上传文件时为什么需要编码——当然,练习的目的是在服务器上准确地复制文件;将zip文件解码为
unicode
对象似乎很奇怪

如果您要发布您得到的错误(“读取文件时出现编码错误”)和完整的回溯,那么有人可以帮助您,这将是一个非常好的主意。还需要:您提到的API的URL

Update您说在
body='\r\n'行中有一个“ascii错误”。join(L)
。根据您有限的信息,一个合理的猜测是您有以下问题:

>>> "".join([u"foo", "\xff"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
为此:

for key, filename in files:
    f = file(filename, 'rb') # Specify binary mode in case this gets run on Windows
    filedata = f.read() # don't decode it
输入该函数后,立即打印其参数,以便可以准确地看到哪些是
unicode

print "fields:", repr(fields)
print "files:", repr(files)
通过(明确地)执行
unicode\u object.encode(“ascii”)
,很可能
unicode
对象都可以安全地强制为
ascii

更新2:值得研究的是,您的值中有一些是
unicode
,还有一些是
str
。似乎所有的
unicode
都可以安全地编码为
ascii

new = [(k, v.encode('ascii') if isinstance(v, unicode) else v) for k, v in original]

好的,在使用
.decode('ISO-8859-1')
之前,我添加了完整的代码作为错误的解释。谢谢你的快速回答@Jaliborc:您还没有显示(1)您收到的实际错误消息(2)错误的完整回溯(3)您提到的API的URL。调用“\r\n”时出现ascii错误。join(L)”不是一个解释,也不需要解释——如果可以解释错误,就不需要问问题。只需使用复制/粘贴来显示错误消息和回溯。好的,我已经在问题中包含了错误的完整回溯。我也试过你的建议,但也没用。API基本上由获取游戏版本的json请求(第一个函数)和上传带有给定变量的文件的json请求组成(如
upload\u file
中所述)。这其实并不重要:这是一个编码问题。@Jaliborc:那么显示args内容的print语句的输出是什么呢?好的,你说得对,它充满了unicode字符串。我应该把它们全部编码吗?
for key, filename in files:
    f = file(filename, 'r')
    filedata = f.read().decode("ISO-8859-1")
for key, filename in files:
    f = file(filename, 'rb') # Specify binary mode in case this gets run on Windows
    filedata = f.read() # don't decode it
print "fields:", repr(fields)
print "files:", repr(files)
new = [(k, v.encode('ascii') if isinstance(v, unicode) else v) for k, v in original]