Это деталь, которая немного зависит от платформы. Если бы вы использовали Windows, вы бы получили исключение FileExistsError
, но не в Unix.
Вот что говорится в документации:
Переименуйте файл или каталог src в dst. Если dst существует, операция завершится ошибкой с подклассом OSError в ряде случаев:
В Windows, если dst существует, всегда возникает FileExistsError.
В Unix, если src является файлом, а dst — каталогом или наоборот, соответственно будет вызвано сообщение об ошибке IsADirectoryError или NotADirectoryError. Если оба являются каталогами и dst пуст, dst будет заменен молча. Если dst является непустым каталогом, возникает ошибка OSError. Если оба являются файлами, dst будет заменен автоматически, если у пользователя есть разрешение. Операция может завершиться ошибкой в некоторых разновидностях Unix, если src и dst находятся в разных файловых системах. В случае успеха переименование будет атомарной операцией (это требование POSIX).
Поэтому вам нужно выполнить ручную проверку, существует ли файл, и, если он существует, каким-то образом обработать его.
Одна вещь, которая, вероятно, не повлияет на вашу программу, заключается в том, что проверка этой формы (из ответа аланиви):
while os.path.exists(new_filename):
value += 1
new_filename = f'wallpaper{value}.jpg'
os.rename(file, new_filename)
не совсем безопасно. Между событием, когда вы установили, что имя файла свободно, и событием, когда вы начинаете писать, другой процесс может создать файл с этим именем. Если это вас беспокоит, взгляните на этот вопрос
Комбинация подхода аланиви и это может выглядеть так:
while True:
value += 1
new_filename = f'wallpaper{value}.jpg'
try:
os.open(new_filename, os.O_CREAT | os.O_EXCL)
break
except FileExistsError:
pass
Основной принцип заключается в том, что вы никогда не можете знать заранее, будет ли операция успешной или нет. Итак, что вам нужно сделать, это попытаться выполнить операцию и посмотреть, удалось ли это.
person
klutt
schedule
22.06.2020