Python. 尝试使用包含特殊字符的文件名创建新目录时出错

2 投票
2 回答
1654 浏览
提问于 2025-04-17 19:27

我的脚本会在它所在的目录里搜索文件,然后用找到的文件名创建新的目录,并把文件移动到那个目录里。例如,文件名是 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字符串了。

撰写回答