我有一个程序可以帮助处理一些文件操作任务。它构建了可以使用的文件列表:
useful_files = [file for file in os.listdir(self.operatingDirs[0])
if re.match(this_task_re, file)]
然后它与他们做了什么。它会不时地告诉用户它在做什么:
for file_name in useful_files:
pub.sendMessage("LOG MESSAGE", msg = "Checking folders for %s" % file_name)
当欧洲用户使用此程序时,它会像这样开始失败:
File "usefulfilefolder.pyc", line 310, in _DeduceDropBoxFolders
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 14: ordinal not in range(128)
在sendMessage
来电的行上。
我试图将从os.listdirs
获取的文件名插入到消息字符串中,似乎生成了错误。
IE:看来我从文件系统获取的文件名不能直接打印出来。
这是对的吗?
我该如何处理?
请注意,我必须(我相信)保留我从listdirs获得的名称,以便我可以在其他文件系统操作中使用它来引用相同的文件....
谢谢!
(注意 - 由于不支持的库,我目前无法轻松升级到Python3)
(编辑以澄清以下评论中提出的观点)
答案 0 :(得分:0)
首先,让你输入正确的编码,如utf-8。 http://www.python.org/dev/peps/pep-0263/
然后,使用some_string.decode('encoding')发生错误。
答案 1 :(得分:0)
我发现如果我这样做的话:
file_name = os.listdir(problem_dir)[0]
print "I looked at %s" % file_name
我收到了unicode错误。这真的是yuk吗?在我看来它是:我无法安全地打印从os.listdir()得到的东西!
如果我这样做的话:
file_name = os.listdir(problem_dir)[0]
print "I looked at %s" % file_name.decode(sys.getfilesystemencoding())
然后它有效。
所以这是某种答案,但我真的希望有更好的方法吗?
我发现很难测试,因为我的机器上没有unicode文件名,因此我不得不与合作用户进行迭代。我想知道:做
是否有效file_name = os.listdir(problem_dir)[0].decode(sys.getfilesystemencoding())
并在以后随处使用该名称。我是否能够依赖
这一事实 进行解码后, os.path.exists(file_name)
会是真的吗? (如果这是真的很好,但它会让我感到惊讶)
TVMIA!
答案 2 :(得分:0)
最佳解决方案是:
from __future__ import unicode_literals