为什么除了块之外,这个不能捕获FileExistsError?

时间:2019-02-19 15:43:08

标签: python exception try-catch

我正在尝试重命名文件,但是如果文件名已经存在就可以继续。该脚本以引发的FileExistsError异常停止,尽管我认为我正在告诉它寻找该异常?是的,引发异常时文件已经存在。

try:
    # rename the file
    os.rename(infilename, newname)
except FileExistsError:
    # output if it exists already
    print(f'{newname} already exists')
    pass

跟踪是:

Exception has occurred: FileExistsError
[WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\MacalusoC\\Desktop\\PNC_to_Evo\\Evo DECO-10\\Evo PROG6001  FSJD0250240M  E.DBP' -> 'C:\\Users\\MacalusoC\\Desktop\\PNC_to_Evo\\Evo DECO-10\\Evo PROG6001  FSJD0250240M  E.part'
  File "C:\Users\MacalusoC\Desktop\PNC_to_Evo\PNC_Deco_to_Evo_Deco.py", line 75, in purge_DBP_files
    os.rename(infilename, newname)
  File "C:\Users\MacalusoC\Desktop\PNC_to_Evo\PNC_Deco_to_Evo_Deco.py", line 341, in main
    purge_DBP_files(new_folder)
  File "C:\Users\MacalusoC\Desktop\PNC_to_Evo\PNC_Deco_to_Evo_Deco.py", line 350, in <module>
    main()

3 个答案:

答案 0 :(得分:1)

  

os.rename(src,dst,*,src_dir_fd = None,dst_dir_fd = None)   将文件或目录src重命名为dst。如果dst是目录,则将引发OSError。在Unix上,如果dst存在并且是文件,则在用户具有权限的情况下将无提示地替换它。如果src和dst在不同的文件系统上,则该操作在某些Unix风格上可能会失败。如果成功,重命名将是原子操作(这是POSIX要求)。在Windows上,如果dst已经存在,即使它是一个文件,也会引发OSError。   [1] https://docs.python.org/3/library/os.html

因此,要么是因为您使用的是Unix系统,要么是捕获了错误的异常,因此不会引发异常。

答案 1 :(得分:0)

为什么不改变你的逻辑?通常最好先检查是否可以先完成某件事,而不是先尝试看看是否失败。

from os import path, rename

if not path.exists(newname):
    rename(infilename, newname)

答案 2 :(得分:0)

下面的代码将尝试重命名文件。参见前提条件检查

config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789'