开发者社区 问答 正文

为什么Python(使用3.7)重命名器不允许目录以数字开头?

我创建了下面的重命名器(如下)来替换文件名和目录名中的句点,这对于文件名来说似乎很好,但是对于以整数开头的目录名来说就不行了。不会产生任何错误。如果在任何目录名中都没有整数,那么它对目录是有效的。否则,它只是重命名文件,而不是目录。有人能告诉我为什么吗? 任何帮助都非常感谢。

import os

def Replace_Filename(Root_Folder):

    for Root, Dirs, Files in os.walk(Root_Folder):
       for File in Files:
        print(File)
        Fname, Fext = os.path.splitext(File)
        print(Fname)
        print(Fext)
        Replaced = Fname.replace(".","_")
        print(Replaced)
        New_Fname = Replaced + Fext
        print(New_Fname)
        F_path = os.path.join(Root, File)
        print(F_path)
        New_Fpath = os.path.join(Root, New_Fname)
        print(New_Fpath)
        os.rename(F_path, New_Fpath)


def Replace_Dirname(Root_Folder):

    for Root, Dirs, Files in os.walk(Root_Folder):
       for Dir in Dirs:
        print(Dir)
        New_Dname = Dir.replace(".","_")
        print(New_Dname)
        D_Path = os.path.join(Root, Dir)
        print(D_Path)
        New_Dpath = os.path.join(Root, New_Dname)
        print(New_Dpath)
        os.rename(D_Path, New_Dpath)




Root_Folder = "D:\\Practicerename-Copy"
Replace_Filename(Root_Folder)
Replace_Dirname(Root_Folder)

问题来源StackOverflow 地址:/questions/59379027/why-does-this-python-using-3-7-renamer-not-allow-directories-to-start-with-a-n

展开
收起
kun坤 2019-12-30 09:54:32 580 分享 版权
阿里云 AI 助理回答

在你的代码中,Replace_Dirname 函数应该能够正常工作,包括重命名以整数开头的目录。但是,根据你的描述,如果在递归遍历并重命名文件之后再尝试重命名目录,可能会遇到问题,因为一旦文件名更改,os.walk() 生成的目录列表可能不再匹配实际的目录结构。

为了解决这个问题,你应该先执行 Replace_Dirname 函数,然后再执行 Replace_Filename 函数。这样可以确保在尝试重命名目录之前,目录结构仍然是原始状态。下面是调整后的代码顺序:

import os

def Replace_Filename(Root_Folder):
    # ... (原函数内容保持不变)

def Replace_Dirname(Root_Folder):
    # ... (原函数内容保持不变)


Root_Folder = "D:\\Practicerename-Copy"
Replace_Dirname(Root_Folder)  # 先重命名目录
Replace_Filename(Root_Folder)  # 然后重命名文件

另一个潜在的问题可能是并发修改目录树。尽管 Python 的 os.rename() 应该是原子操作,但在快速连续调用时,尤其是在大型或深层目录结构中,操作系统级别的延迟或锁可能导致意外行为。不过,在大多数情况下,上述顺序调整应该足以解决问题。

如果问题仍然存在,考虑添加错误处理逻辑来捕获并打印 os.rename() 调用中可能出现的异常,这可以帮助诊断具体哪里出了问题。例如:

try:
    os.rename(D_Path, New_Dpath)
except OSError as e:
    print(f"Error: {e.strerror}. Renaming directory {D_Path} to {New_Dpath} failed.")

请尝试这个顺序和错误处理建议,看是否能解决你遇到的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答