为什么os.rename()在Python 2.7中引发异常?

mat*_*ier 3 python windows file errno

print(path)
print(dir_name+"\\"+f_parent+"_"+parts[0]+"_"+date+extension)
os.rename(path, dir_name+"\\"+f_parent+"_"+parts[0]+"_"+date+extension)
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

转换为:

 WindowsError: [Error 183] Can not create a file that already exists
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 5

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

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

# MOVEFILE_REPLACE_EXISTING = 0x1; MOVEFILE_WRITE_THROUGH = 0x8
ctypes.windll.kernel32.MoveFileExW(src, dst, 0x1)
Run Code Online (Sandbox Code Playgroud)

了解如何atomicfile.atomic_rename()在Windows上实现.