Python. 尝试使用包含特殊字符的文件名创建新目录时出错
我的脚本会在它所在的目录里搜索文件,然后用找到的文件名创建新的目录,并把文件移动到那个目录里。例如,文件名是 John-doe-taxes.hrb,它会变成 John-doe/John-doe-taxes.hrb。这个过程一直很顺利,直到遇到带有变音符号的字符(比如德语中的ü),这时它会创建目录,但会出现“错误2”,提示找不到文件。我对编程还比较陌生,网上找到的解决办法是往文件里加一行
coding: utf-8
,但我觉得这不管用,因为我在代码里没有用到变音符号,我处理的是带变音符号的文件。我想知道,这个问题只出现在变音符号上,还是其他特殊字符也会有类似的问题?这是我正在使用的代码,感谢任何提供的建议。
import os
import re
from os.path import dirname, abspath, join
dir = dirname(abspath(__file__))
(root, dirs, files) = os.walk(dir).next()
p = re.compile('(.*)-taxes-')
count = 0
for file in files:
match = p.search(file)
if match:
count = count + 1
print("Files processed: " + str(count))
dir_name = match.group(1)
full_dir = join(dir, dir_name)
if not os.access(full_dir, os.F_OK):
os.mkdir(full_dir)
os.rename(join(dir, file), join(full_dir, file))
raw_input()
2 个回答
1
有一点需要考虑的是使用Python 3。它默认支持unicode,这样处理字符时会更方便。我不太确定你是否需要对上面的代码做什么修改才能让它正常工作,不过在示例中有一个Python脚本可以帮助你把Python 2的代码转换成Python 3。
抱歉我不能帮你解决Python 2的问题,我之前也遇到过类似的情况,最后我选择把我的项目转到Python 3——对我来说,这样做简单多了!
1
我觉得你的问题是把不符合系统编码的str
字符串传给了os.rename
。只要文件名里用的都是ascii字符,这样是没问题的,但如果超出了这个范围,你可能会遇到麻烦。
最好的解决办法可能是使用unicode。文件系统的功能如果你给它unicode参数,它应该会返回unicode字符串。在Windows上,open
处理unicode文件名应该也没问题。
如果你这样做:
dir = dirname(abspath(unicode(__file__)))
那么你就可以一直使用unicode字符串了。