openpyxl закрывает архив после прерывания операции чтения, потому что максимальное количество строк составляет 1048498 строк

У меня две проблемы с использованием openpyxl

  1. Количество строк в электронной таблице равно 1048498. Итерация потребляет память, поэтому я добавил логику для проверки первых пяти пустых столбцов и выхода из нее.

  2. Логика 1 работает для меня, и код не бесконечно перебирает пустые ячейки электронной таблицы. Я использую P4Python, чтобы удалить этот файл только для чтения после того, как я закончу его читать. Однако openpyxl по-прежнему использует этот файл, и нет другого способа, кроме сохранения, для закрытия архива, используемого внутри. Поскольку мой файл находится в режиме только для чтения, я не могу его сохранить. Когда P4 пытается удалить этот файл, я получаю эту ошибку: «Процесс не может получить доступ к файлу, потому что он используется другим процессом».

Помощь приветствуется :)


person Nick    schedule 27.06.2015    source источник
comment
Предоставьте дополнительную информацию об использовании памяти.   -  person Charlie Clark    schedule 27.06.2015
comment
Для вашей проблемы с закрытием: stackoverflow.com/questions/11214908/closing-files -in-openpyxl вы пытались удалить файл, комментируя весь код openpyxl?   -  person Eric Levieil    schedule 27.06.2015
comment
Что касается вашей проблемы с максимальным количеством строк, я предполагаю, что в вашем файле гораздо меньше строк. Это известная проблема: bitbucket.org/openpyxl/openpyxl/ выпуск/278/   -  person Eric Levieil    schedule 27.06.2015
comment
Что касается проблемы с закрытием, я прочитал другой опубликованный вами пост, в котором говорится, что для чтения (не сохранения) openpyxl закрывает для вас архив. Однако в моем случае я выхожу из цикла, и когда P4Python пытается удалить этот файл, он все еще используется процессом, порожденным openpyxl. Я не уверен, что правильно понимаю удаление файла при комментировании всего кода openpyxl. Удаление файла работало для меня раньше, когда я работал только с P4Python, и после пути хранилища файлов синхронизации p4 я запускал путь хранилища файлов синхронизации p4 № 0, и это действительно удаляло файл, в то время не было openpyxl.   -  person Nick    schedule 29.06.2015
comment
Да, максимальное количество строк — это известная проблема, для которой я добавил логику, чтобы вручную проверять, являются ли первые X столбцов пустыми ячейками, и выйти из цикла чтения.   -  person Nick    schedule 29.06.2015
comment
@CharlieClark, память больше не перегружается, поскольку я обнаруживаю конец файла, последнюю строку, проверяя пустые значения в первых столбцах «X». Я даже пытался использовать ws.calculate_dimension(force=True), он по-прежнему дает мне - 1048498 строк, и если я запускаю итератор строк для этих многих строк, он будет занимать память, поэтому я выхожу из цикла.   -  person Nick    schedule 29.06.2015
comment
@EricLevieil, я только что попытался закомментировать весь код openpyxl, и он успешно удалил файл.   -  person Nick    schedule 29.06.2015
comment
Затем посмотрите, работает ли он за пределами perforce (открытие файла в openpyxl и его удаление)...   -  person Eric Levieil    schedule 29.06.2015
comment
Что вы делаете с клетками, когда получаете их? Вы случайно не ws.columns работаете? Это разместит все ячейки в памяти.   -  person Charlie Clark    schedule 29.06.2015
comment
wb = load_workbook(filename=CLIENT_ROOT, read_only=True, use_iterators=True) staff_info = wb[ESCHER_STAFF_INFO_SHEET_NAME] для строки в staff_info.iter_rows(row_offset=1): row[0].value Я использую итераторы и только для чтения, как только я получить ячейку, используя iter_rows, я просто получаю доступ к значению ячейки. Я знаю, что ws.columns занимает память.   -  person Nick    schedule 29.06.2015
comment
Может ли кто-нибудь удалить отрицательный момент по этому вопросу, поскольку это действительная проблема?   -  person Nick    schedule 24.07.2015


Ответы (2)


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

person Charlie Clark    schedule 27.06.2015

Это похоже на существующую проблему или предполагаемое поведение с openpyxl. Если у вас есть файл только для чтения (операция синхронизации P4Python — p4.run_sync(file_path_to_sync)) и если вы читаете его с помощью openpyxl, вы не сможете удалить файл (P4Python p4.run_sync(file_path_to_sync + '#0') — удалить из рабочей области), пока не сохраните файл, что невозможно ( или предназначен в моем случае), так как это файл только для чтения.

person Nick    schedule 22.07.2015