我知道有很多关于" UTF-8" Python 2上的编码问题,但到目前为止我无法找到解决问题的方法。我目前正在创建一个脚本来获取文件的名称并在xlwt中将其超链接,以便可以通过电子表格中的点击来访问该文件。问题是,这些文件的某些名称包含非ASCII字符。
问题1
我使用以下行检索文件的名称。顺便提一下,文件夹中只有一个文件。
>>f = filter(os.path.isfile, os.listdir(tmp_path))[0]
然后
>>print f
'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc'
>>print sys.stdout.encoding
'UTF-8'
>>f.decode("UTF-8")
*** UnicodeDecodeError: 'utf8' codec can't decode byte 0xe7 in position 76: invalid continuation byte
通过浏览这里的讨论,我意识到" \ xe7 \ xe3o"不是" UTF-8"编码。运行以下行似乎支持这一点。
>>f.decode("latin-1")
u'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc'
我的问题是,为什么变量f被编码在" latin-1"当系统编码设置为" UTF-8"?
时问题2
虽然f.decode(" latin-1")为我提供了我想要的输出,但我仍然无法将变量提供给电子表格中的超链接功能。
>>data.append(["File", xlwt.Formula('HYPERLINK("%s";"%s")' % (os.path.join(dl_path,f.decode("latin-1")),f.decode("latin-1")))])
*** FormulaParseException: can't parse formula HYPERLINK("u'H:\\Mad Lab\\SE Doc Crawler\\bovespa\\download\\521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc's;"u'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc's)
显然,结束双重报价被吃掉了,被一个" ' S"后缀。有人可以帮忙解释一下这里发生了什么吗? 0.0
哦,如果有人可以提出上述问题2的解决方案,那么我将非常感激 - 因为你会让我的周末免于痛苦!
提前致谢!
答案 0 :(得分:0)
欢迎来到令人困惑的编码世界!至少要处理文件编码,终端编码和文件名编码,这三者可能不同。
在Python 2.x中,目标是从编码的str中获取Unicode字符串(与str
不同)。问题是您并不总是知道str
使用的编码,因此难以解码。
使用listdir()
获取文件名时,有一个记录但经常被忽视的怪癖 - 如果您将str
传递给listdir()
,则会被编码str
。这些将根据您的语言环境进行编码。在Windows上,这些将是一个8位字符集,如windows-1252
。
或者,改为传递listdir()
Unicode字符串。
E.g。
os.listdir(u'C:\\mydir')
请注意u
前缀
这将返回正确解码的Unicode文件名。在Windows和OS X上,只要您的环境区域设置没有被搞乱,这就非常可靠。
在您的情况下,listdir()
会返回:
u'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc'
再次注意u
前缀。您现在可以将其打印到PyCharm控制台而无需修改。
E.g。
f = filter(os.path.isfile, os.listdir(tmp_path))[0]
print f
答案 1 :(得分:0)
对于问题2,由于时间限制,我没有进一步调查,只是将输出打印为unicode字符串,而不是xlwt对象。我能够继续这个项目,虽然我不知道这里出了什么问题。从这个意义上说,上面的两个问题已得到解答。