管理Mac OS在Windows环境中使用非ASCII字符创建的文件名?

时间:2011-10-06 23:40:36

标签: python macos unicode filenames

我处理大量的未知文件,并且一直在学习python来帮助我过滤/排序和压缩这些文件。

我正在看的一个集合有大量的资源分支,我写了一个小脚本来找到它们,并删除它们(下一步就是找到它们,移动它们,但那是另一天)。

我在这个集合中发现文件名中有许多非ascii字符的文件,这似乎是绊倒了os.delete函数。

示例文件名:._ spec com report 395 (N.B. 3下方有一个小点,我找不到一个例子,或弄清楚如何显示文件名的十六进制......)

我记录了所有文件名,这是该文件的日志记录:._ spec com report 3?95

我得到的错误是一个windowserror,因为它无法找到文件(它传递的字符串不是Windows OS所知的文件。)我放入了一个try子句让我工作rounf它,但我真的很想妥善处理它。

我也尝试在walk选项`os.walk(u'。')中使用unicode开关,按照这篇帖子:Handling ascii char in python string(最佳答案),我看到以下错误:

Traceback (most recent call last):
 File "<stdin>", line 3, in <module>
 File "c:\python27\lib\encodings\cp850.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\uf022' in position
20: character maps to <undefined>

所以我猜测的答案在于如何解析文件名,并想知​​道是否有人能指出我正确的方向......

代码:

import os
import sys

rootdir = "c:\target Dir to walk"
destKeep = "Keepers.txt"
destDelete = "Deleted.txt"

matchingText = "._"
files_removed = 1
for folder, subs, files in os.walk(rootdir):  
    outfileKeep = open(destKeep,"a")
    outfileDelete = open(destDelete,"a")
    for filename in files:
        matchScore = filename.find(matchingText)
        src = os.path.join(folder, filename)
        srcNewline = src + ", " + str(filename) + "\n"
        if matchScore == -1:
        outfileKeep.writelines(srcNewline)
        else: 
            outfileDelete.writelines(srcNewline)
            try:
                os.remove(src)
        except WindowsError:
                print "I was unable to delete this file:"
                outfileKeep.writelines(srcNewline)
            files_removed += 1
            if files_removed:
                print '%d files removed' % files_removed
            else :
                print 'No files removed'
    outfileKeep.close()
    outfileDelete.close()

1 个答案:

答案 0 :(得分:3)

os.walk(u'.')是获取原生Unicode文件名的常用方法,它应该可以正常工作;它对我有用。

你的问题就在这里:

srcNewline = src + ", " + str(filename) + "\n"

str(filename)将使用默认编码将您的Unicode字符串转换回字节,并且因为该编码没有字符U + F022(*),您将获得UnicodeEncodeError。您必须通过执行例如srcNewLine= '%s, %s\n' % (src, filename.encode('utf-8'))来选择要存储在输出文件中的编码,或者(或许更好)将字符串保留为Unicode并使用codecs.open ed文件将它们写入文件。

(*:这是一个不应该使用的私人使用区域角色,但是现在我猜你做的不多了......)