我正在为使用Requests和Python 2.7的运动员收集一组CSV。
这些文件由MSFT报告服务器生成,并以iso-8859-1的形式出现,Requests说。
因为我每晚都要与成千上万的人打交道,所以我想对文件进行sha256并与之前的运动员哈希值进行比较。如果哈希匹配,我不会忘记将文件保存到磁盘。这些文件很小 - 最大约为6K - 所以没有分块/流媒体问题。
然而,sha256失败了,因为这些文件的BOM令人讨厌。我已经看过10种不同的解决方案"在这里,找不到一个会通过decode.encode拉出BOM,以便我可以做我的sha256。
我可能需要恢复的一个解决方法是,我可以将文件写入磁盘,然后在那里使用sha256。但这似乎是非常糟糕的形式。
如果我可以在开始时删除BOM,我将有一个与sha256一起使用的过程,使我免于处理多余的文件。
我认为问题可能是我表面上尝试对文件对象进行字符串操作。但由于该对象仍然是一个u" / ...十六进制流,我认为这些操作会起作用......
以下是详细信息:
>>> r = requests.get('http://66.73.188.164/ReportServer?%2fCPTC%2fWomens1stHalfDetail&Team=&player=17424&rs:Format=CSV')
>>> r.status_code
200
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x18afb70>
>>> r.encoding
'ISO-8859-1'
>>> print r.headers['content-type']
text/plain
>>> r.text[0]
u'\xff'
首次尝试转换无法使用指定的编码类型进行解码!
>>> z = r.text
>>> z.decode('iso-8859-1').encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
事实上,&#34;类型&#34; z现在与预期不同,可能是因为sys(mac; utf8)?
>>> type(z)
<type 'unicode'>
>>> z[0]
u'\xff'
>>> z[0:5]
u'\xff\xfem\x00a'
解码和编码的各种尝试都让我失望;这是许多这样的尝试之一。
>>> z.decode('utf-8-sig').encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/encodings/utf_8_sig.py", line 22, in decode
(output, consumed) = codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
我确定答案是单行的;我只是没有看到它。任何指导最受赞赏。
答案 0 :(得分:2)
也许您可以尝试通过仅编码文件的其余部分来获取sha256来省略BOM?如:
z = r.text[2:]
z.decode ...
相同的逻辑必须应用于已存储在磁盘上的文件的哈希值,但这应该不是问题。
答案 1 :(得分:0)
您应该使用r.content
,例如
r.content.decode('utf8')
或者,您也可以覆盖执行<{p}}的r.encoding
r.encoding = 'utf8'
然后您可以使用r.text
而无需担心。