我处理大量的未知文件,并且一直在学习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()
答案 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文件将它们写入文件。
(*:这是一个不应该使用的私人使用区域角色,但是现在我猜你做的不多了......)