在Python 2.7中使用unicode字符打印文件名

时间:2013-09-14 12:31:18

标签: python-2.7 unicode

我有一个程序可以帮助处理一些文件操作任务。它构建了可以使用的文件列表:

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)

(编辑以澄清以下评论中提出的观点)

3 个答案:

答案 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