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

3
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

第三行引发了以下错误:

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

2
看起来已经有一个同名的文件,你想重命名的文件名已经存在了?你检查过了吗? - Junuxx
这个文件已经存在了吗? - BrenBarn
另一个客户端悄悄地运行了脚本...好笑,OK! - mat.viguier
1
为了使其更具可移植性,您可以使用os.path.join代替自己打补丁来分隔目录('\')。这样,您就不必担心转义它们和其他事情。 - Will
@J.F.Sebastian:检查;重新开放投票。 - Martijn Pieters
显示剩余3条评论
3个回答

7
在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)

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


3

Windows系统错误代码列表中得知:

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来创建您的文件名。

0

您正在尝试使用的名称已经属于某个对象。也就是说,已经有一个名为:

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

在你的函数中添加一个检查


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接