Python [Errno 13] Отказано в доступе при открытии некоторых изображений

Я пытаюсь обработать некоторые файлы, созданные в папке, но иногда при открытии файла python возвращает мне [Errno 13]: Отказано в доступе.

я просто делаю

file = open(file_path, 'rb')

и самое странное, что в большинстве случаев файлы открываются корректно и ошибка не связана с каким-то конкретным файлом (проверял несколько раз). Я уже пытался изменить форматирование file_path, но безрезультатно.

Я использую python 3.5 и watchdog lib для просмотра каталога событий создания файлов, затем я получаю src_path события и открываю его. Кроме того, работает на Windows 10.


person Bruno    schedule 11.05.2017    source источник
comment
При попытке открыть один и тот же файл иногда выдается ошибка, а иногда работает? Такое несоответствие может быть вызвано попыткой открыть файл, который уже открыт в другом месте...   -  person Right leg    schedule 11.05.2017
comment
sometimes ... most of the times ... как мы должны воспроизвести ошибку и помочь вам, если даже вы не можете успешно воспроизвести ошибку? Предоставьте минимальный, полный и проверяемый пример.   -  person Mike Scotty    schedule 11.05.2017
comment
@Rightleg, но когда я снова запускаю код и пытаюсь открыть файл, вызвавший ошибку, он работает. И файл открывается в коде только один раз, так как срабатывает при его создании.   -  person Bruno    schedule 11.05.2017
comment
@ mpf82 ошибка возникает в конце концов, когда я открываю файлы, я не нашел для нее шаблона, и я уже пытался искать имена файлов, права доступа к файлам, права пользователя и размер файла, но это не имеет значения в возникновении ошибки.   -  person Bruno    schedule 11.05.2017


Ответы (3)


Итак, похоже, проблема была немного в коде. Как я уже упоминал, я использовал сторожевую библиотеку для обнаружения создания файла, и в этом случае я открыл созданный файл. Дело в том, что событие создания файла происходит не в момент завершения перемещения/вставки/создания файла, а в момент поступления в каталог первых нескольких байтов. Итак, проблема заключалась в том, что я пытался открыть файл до того, как процесс «создания» был завершен, и поэтому он все еще записывался.

Я искал способ получить событие завершения записи, но в сторожевой библиотеке нет этой функции, и похоже, что события завершения записи доступны только для Linux.

Итак, теперь я жду некоторое время, прежде чем открыть файл через поток таймера, и, похоже, он работает довольно хорошо, поскольку мне не нужны мгновенные действия с новыми файлами и не нужно обрабатывать огромные файлы.

person Bruno    schedule 15.05.2017
comment
Вы перестали использовать watchdog? - person SalahAdDin; 08.08.2018

Я также получал ту же ошибку «Отказано в доступе», но если вы подождете около 2 секунд после события создания, а затем прочитаете файл, он будет разрешен.

person nitinaggarwal    schedule 11.08.2018

Вы можете добавить фрагмент ниже, чтобы дождаться завершения операции.

init_size = -1
while True:
    current_size = os.path.getsize(event.src_path)
    if current_size == init_size:
        break
    else:
        init_size = os.path.getsize(event.src_path)
        time.sleep(2)
print("file copy has now finished")
person Basil Jose    schedule 05.02.2021