Почему это, кроме блока, не перехватывает FileExistsError? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь переименовать файл, но если имя файла уже существует, просто двигаться дальше.Сценарий останавливается с поднятым исключением 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 голосов
/ 19 февраля 2019

Почему бы не перевернуть логику?Часто лучше сначала проверить, можно ли что-то сделать, чем попробовать, и посмотреть, не получится ли это.

from os import path, rename

if not path.exists(newname):
    rename(infilename, newname)
0 голосов
/ 19 февраля 2019

Приведенный ниже код попытается переименовать файл.Смотрите предварительные условия проверки

import os


def rename_file(current_file_name, new_file_name):
    """ rename a file if 'current_file_name' exists and 'new_file_name' doesnt exist 

    :param current_file_name: 
    :param new_file_name: 
    :return: 
    """
    if os.path.exists(new_file_name) or not os.path.exists(current_file_name):
        return
    else:
        os.rename(current_file_name, new_file_name)
0 голосов
/ 19 февраля 2019

os.rename (src, dst, *, src_dir_fd = Нет, dst_dir_fd = Нет). Переименуйте файл или каталог src в dst.Если dst является каталогом, будет вызвано OSError.В Unix, если dst существует и является файлом, он будет автоматически заменен, если у пользователя есть разрешение.Операция может завершиться с ошибкой на некоторых разновидностях Unix, если src и dst находятся на разных файловых системах.В случае успеха переименование будет атомарной операцией (это требование POSIX).В Windows, если dst уже существует, OSError будет вызываться, даже если это файл.[1] https://docs.python.org/3/library/os.html

Таким образом, исключение не выдается, потому что вы работаете в системе Unix или вы перехватываете неправильное исключение.

...