У меня есть механизм file_rename
, который я хочу улучшить с помощью простого блока try/except
, который будет проверять, существует ли уже переименованный файл в каталоге.
Я подготовил в своем каталоге 2 файла: data.txt
и old_data.txt
. Функция должна генерировать исключение, так как old_data.txt
уже существует, что означает, что данные были обработаны в прошлом.
Однако приведенный ниже код не работает, так как он все еще переименовывает файл data.txt
. Буду признателен за любую помощь и рекомендации по этому поводу.
@staticmethod
def file_rename(file, dir):
source_file_new_name = "old_" + file
try:
os.path.isfile(dir + source_file_new_name)
os.rename(os.path.join(dir, file), os.path.join(dir, source_file_new_name))
except FileExistsError:
raise FileExistsError("this file was already processed")
С подсказкой Rafał и BrokenBenchmark я придумал версию ниже, но не уверен, что она достаточно питоническая;)
class FileExistsError(Exception):
pass
@staticmethod
def file_rename(file, dir):
source_file_new_name = "old_" + file
if os.path.isfile(dir + source_file_new_name):
raise FileExistsError("this file was already processed!")
else:
os.rename(os.path.join(dir, file), os.path.join(dir, source_file_new_name))
Ubuntu на WSL2/Windows 10
Превосходно; отредактируйте это в своем посте. Это важно, напишите ответ сейчас.
Метод os.path.isfile просто возвращает True (если файл существует) или False (если его нет). Используйте оператор if, чтобы проверить его результат перед вызовом os.rename.
Не уверен, насколько питоническим это будет, но raise
можно использовать и в блоке if
: if os.path.isfile(dir + source_file_new_name): os.rename(os.path.join(dir, file), os.path.join(dir, source_file_new_name)) raise FileExistsError("this file was already processed")
Вы можете, но должны ли вы? Честно говоря, это в основном зависит от ваших личных предпочтений в отношении того, как обрабатывать логические ошибки. Например. поиск EAFP (проще попросить прощения, чем разрешения) как общий стиль кодирования Python.
Ваш код предполагает, что os.rename
вызовет FileExistsError
. Это предположение можно сделать только в том случае, если код выполняется в Windows.Документы Python для состояния os.rename()
:
os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Rename the file or directory src to dst. If dst exists, the operation will fail with an
OSError
subclass in a number of cases:On Windows, if dst exists a
FileExistsError
is always raised.On Unix, ... [i]f both [src and dst] are files, dst it [sic] will be replaced silently if the user has permission.
Чтобы решить эту проблему, используйте оператор if
с .isfile()
вместо того, чтобы полагаться на try/except
, который зависит от поведения, которое не является переносимым для работы:
def file_rename(file, dir):
source_file_new_name = "old_" + file
if os.path.isfile(os.path.isfile(dir + source_file_new_name)):
os.rename(os.path.join(dir, file), os.path.join(dir, source_file_new_name))
Не уверен, насколько питоническим это будет, но повышение можно использовать и внутри блока if: if os.path.isfile(dir + source_file_new_name): os.rename(os.path.join(dir, file), os.path.join( dir, исходный_файл_новое_имя)) поднять FileExistsError("этот файл уже был обработан")
Лично я бы не стал поднимать ошибку только для того, чтобы сразу ее отловить; это добавляет ненужную сложность вашему коду, так как if/else
было бы проще. Но это более субъективно, чем первоначальная проблема.
В моем случае я буду придерживаться его, так как мне нужно прервать выполнение кода, чтобы не загружать данные в базу данных. Тот фрагмент, который я разместил, является частью сценария ELT.
Какую ОС вы используете?