Я использую lxml и python 3 для анализа многих файлов и объединения файлов, которые принадлежат друг другу. Файлы фактически хранятся в парах из двух (которые также объединены) внутри zip-файлов, но я не думаю, что это имеет значение здесь.lxml + load files = random SerialisationError: IO_WRITE
Мы говорим о файлах размером 100 КБ, которые составляют около 900 МБ в виде заархивированной формы.
Мои проблемы в том, что мой скрипт работает нормально, но при somepoint (для нескольких работает это не всегда совпадает с точкой, так что не должно быть проблемой с определенным файлом) я получаю эту ошибку:
File "C:\Users\xxx\workspace\xxx\src\zip2xml.py", line 110, in _writetonorm normroot.getroottree().write(norm_file_path) File "lxml.etree.pyx", line 1866, in lxml.etree._ElementTree.write (src/lxml\lxml.etree.c:46006) File "serializer.pxi", line 481, in lxml.etree._tofilelike (src/lxml\lxml.etree.c:93719) File "serializer.pxi", line 187, in lxml.etree._raiseSerialisationError (src/lxml\lxml.etree.c:90965) lxml.etree.SerialisationError: IO_WRITE
Я не знаю, что вызывает эту ошибку. Весь код немного громоздким, так что я надеюсь, что соответствующие области хватает:
def _writetonorm(self, outputpath):
'''Writes the current XML to a file.
It'll update the file if it already exists and create the file otherwise'''
#Find Name
name = None
try:
name = self._xml.xpath("xxx")[0].text.rstrip().lstrip()
except Exception as e:
try:
name = self._xml.xpath("xxx")[0].text.rstrip().lstrip()
except Exception as e:
name = "damn it!"
if name != None:
#clean name a bit
name = name[:35]
table = str.maketrans(' /#*"$!&<>-:.,;()','_________________')
name = name.translate(table)
name = name.lstrip("_-").rstrip("_-")
#generate filename
norm_file_name = name + ".xml"
norm_file_path = os.path.join(outputpath, norm_file_name)
#Check if we have that completefile already. If we do, update it.
if os.path.isfile(norm_file_path):
norm_file = etree.parse(norm_file_path, self._parser)
try:
normroot = norm_file.getroot()
except:
print(norm_file_path + "is broken !!!!")
time.sleep(10)
else:
normroot = etree.Element("norm")
jurblock = etree.Element("jurblock")
self._add_jurblok_attributes(jurblock)
jurblock.insert(0, self._xml)
normroot.insert(0, jurblock)
try:
normroot.getroottree().write(norm_file_path) #here the Exception occurs
except Exception as e:
print(norm_file_path)
raise e
Я знаю, что моя обработка исключений не велика, но это лишь доказательство работы на данный момент. Может ли кто-нибудь сказать мне, почему происходит ошибка?
Глядя на файл, который вызывает ошибку, он не имеет хорошей формы, но я подозреваю, что это произошло потому, что произошла ошибка, и это было прекрасно до последней итерации.
Это похоже на обычную ошибку ввода-вывода. Имеете ли вы доступ к этим файлам одновременно (несколько рабочих потоков или sth) или, возможно, некоторые другие программы записывают эти файлы во время работы вашего скрипта? В первом случае вы можете получить системный предел (количество открытых файлов), во втором случае программа может заблокировать файл, который вы хотите записать. – Tupteq
Я беспокоился об этом, поэтому в данный момент я запускаю его в одиночном режиме, но до некоторой степени получаю эту ошибку. Я всегда использую контекстных менеджеров, поэтому все должно быть закрыто должным образом. – pypat
Не хорошо. Последняя идея - попробуйте изменить среду: запустите скрипт на другом компьютере или ОС, попробуйте разную версию 'lxml' и, возможно, даже другую версию Python. Было бы хорошо, если бы вы смогли изолировать ошибку (предоставить небольшой автономный код и данные, которые воспроизводят ошибку), чтобы я мог проверить себя. – Tupteq