【问题标题】:Why os.rename() is raising an exception in Python 2.7?为什么 os.rename() 在 Python 2.7 中引发异常?
【发布时间】:2012-10-13 01:58:24
【问题描述】:
print(path)
print(dir_name+"\\"+f_parent+"_"+parts[0]+"_"+date+extension)
os.rename(path, dir_name+"\\"+f_parent+"_"+parts[0]+"_"+date+extension)

第 1 行和第 2 行是调试和语句,这些打印:

D:\Doc\Papa\Photos\2012\2012_07_divers\CSC_3709.jpg
D:\Doc\Papa\Photos\2012\2012_07_divers\2012_07_divers_CSC_3709_2012_07_06_21_04_26.jpg

第 3 行加注:

File "D:\Doc\Papa\scripts\python\photosort\photosort.py", line 83, in rename
  os.rename(path, dir_name+"\\"+f_parent+"_"+parts[0]+"_"+date+extension)
WindowsError: [Error 183] Impossible de créer un fichier déjà existant

翻译成:

 WindowsError: [Error 183] Can not create a file that already exists

【问题讨论】:

  • 看起来已经有一个文件名称是您想要重命名的文件?你检查了吗?
  • 嗯,文件已经存在了吗?
  • 看起来像,但没有同名的文件:)
  • 另一个客户端默默地运行脚本...开个玩笑OK!
  • 为了使其更便携,您可以使用 os.path.join 来代替自己修补目录分隔符('\\')。这样您就不必担心逃脱它们和其他东西。

标签: python windows file errno


【解决方案1】:

在 Python 3.3+ 上,您可以使用 os.replace() 而不是 os.rename() 来覆盖现有文件并避免 Windows 上的错误。

在较旧的 Python 版本上,您可以使用 ctypes 模块模拟 os.replace()

# MOVEFILE_REPLACE_EXISTING = 0x1; MOVEFILE_WRITE_THROUGH = 0x8
ctypes.windll.kernel32.MoveFileExW(src, dst, 0x1)

看看atomicfile.atomic_rename()是如何在Windows上实现的。

【讨论】:

    【解决方案2】:

    来自Windows system error codes list

    ERROR_ALREADY_EXISTS

    183 (0xB7)

    当文件已存在时无法创建该文件。

    您正在尝试创建一个已经存在的文件。先删除它或选择一个不同的文件名。

    额外提示:使用os.path.join() 函数正确连接路径:

    os.path.join(dir_name, '{0}_{1}_{2}{3}'.format(f_parent, parts[0], date, extension))
    

    我还使用string formatting 来创建您的文件名。

    【讨论】:

      【解决方案3】:

      您尝试使用的名称已经属于某物。即,已经有一个文件名为:

      D:\Doc\Papa\Photos\2012\2012_07_divers\2012_07_divers_CSC_3709_2012_07_06_21_04_26.jpg
      

      为您的函数添加检查

      【讨论】:

        猜你喜欢
        • 2014-10-01
        • 1970-01-01
        • 2014-12-05
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 2018-05-20
        • 1970-01-01
        相关资源
        最近更新 更多