Питон зависает при записи в файлы в папке Desktop

UPD Проблема решена

Симптомы исчезли после chkdsk /f и перезагрузки компьютера. Cпасибо @andreymal

Изначальное описание проблемы:

Мне нужно заменять определенные байты в файле на другие байты. Скрипт работал исправно и долго, но сегодня столкнулся с тем, что скрипт зависает. Причем зависание происходит после обработки 10-20 файлов.

Python 3.10. Система Windows 10. Антивирус только Windows defender — отключен.

Покопавшись, я понял, что проблема с функциями file.seek() и file.write(). Если убрать любую из них, то зависаний нет.

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

Вот пример минимального кода, вызывающего зависание скрипта

root = ...
for path, subdirs, files in os.walk(root):
    for name in files:
        file = (os.path.join(path, name))
        print("1")
        with open(file, 'r+b') as f: #Здесь зависание
            print("2")
            f.seek(1)
            f.write(b'\x0a')
        

Зависание происходит на 10-20 файле между выводами "1" и "2". Есть идеи в чем может быть проблема? Как ее отловить?

UPD.

  1. Пробовал разные файлы (формата .bin, .css, .txt). Объем у файлов от 1 до 5 КБ. Более того, если удалить файл, на котором происходит зависание, то зависание будет на другом. А если удалить первые 5 файлов. То те, на которых скрипт зависал, он теперь успешно изменит... но зависнет через 10-15 файлов.

  2. Замена with() на open() + close() не помогает.

UPD: Проблема решается любым из двух способов:

  • Запустить командную строку от админа. Запустить в ней скрипт.

  • Перенести файлы вне папки 'Desktop' — рабочий стол. Если путь лежит через неё, то блокируется запись на 10-20 файле. Почему? Пока не могу найти ответа


Ответы (1 шт):

Автор решения: Константин Емельянов

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

→ Ссылка