0

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

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)

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

4

3 回答 3

0

首先,使您的文件具有正确的编码,例如 utf-8。http://www.python.org/dev/peps/pep-0263/

然后,在发生错误的地方使用 some_string.decode('the encoding') 。

于 2013-09-14T12:44:12.970 回答
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)进行解码后会是真的吗?(如果是真的,那就太好了,但会让我感到惊讶)

电视米亚!

于 2013-09-15T03:29:39.707 回答
0

最好的解决方案是:

from __future__ import unicode_literals
于 2014-01-01T16:58:40.233 回答