我处理大量未知文件集,一直在学习Python来帮助我筛选/排序和处理这些文件。
我正在查看的一个集合有大量的资源叉,我编写了一个小脚本来查找它们并删除它们(下一步是查找它们并将它们移动,但那是另一天的事情)。
我在这个集合中发现有许多文件名中包含非ascii字符,这似乎使os.delete函数无法正常工作。
例如文件名:._spec com report 395 (注:3下面有一个小点,我找不到例子,也不知道如何显示文件名的十六进制...)
我记录了所有的文件名,这是那个文件的记录:._spec com报告3?95
我得到的错误是一个WindowsError,因为它找不到文件(它传递的字符串不是Windows OS所知道的文件名)。我放了一个try语句来解决问题,但我真的想妥善处理它。
我还尝试使用遍历选项中的unicode开关`os.walk(u'。')`,如此帖子所述:处理Python字符串中的ASCII字符(置顶答案),然后我看到以下错误:
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()
EF 80 A2
是 U+F022 的 UTF-8 编码。这就是我期望.encode('utf-8')
在输出到 Keepers.txt/Deleted.txt 文件时的工作方式,所以没问题。但是你不应该使用编码为字节的字符串来实际访问文件,因为当你使用字节字符串作为文件名时,你只能使用系统默认代码页(其中大多数 Unicode 字符都没有,当然也没有虚假的 U+F022 字符)。将文件名保留为 Unicode,只在写入字节流时将它们编码为字节。 - bobince