2014-01-30 4 views
0

Я использую 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 

Я знаю, что моя обработка исключений не велика, но это лишь доказательство работы на данный момент. Может ли кто-нибудь сказать мне, почему происходит ошибка?

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

+0

Это похоже на обычную ошибку ввода-вывода. Имеете ли вы доступ к этим файлам одновременно (несколько рабочих потоков или sth) или, возможно, некоторые другие программы записывают эти файлы во время работы вашего скрипта? В первом случае вы можете получить системный предел (количество открытых файлов), во втором случае программа может заблокировать файл, который вы хотите записать. – Tupteq

+0

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

+0

Не хорошо. Последняя идея - попробуйте изменить среду: запустите скрипт на другом компьютере или ОС, попробуйте разную версию 'lxml' и, возможно, даже другую версию Python. Было бы хорошо, если бы вы смогли изолировать ошибку (предоставить небольшой автономный код и данные, которые воспроизводят ошибку), чтобы я мог проверить себя. – Tupteq

ответ

0

Возможно, было ошибкой использовать для этого подключенные сетевые диски. Нет такого исключения при разрешении работы с файлами локально.

Узнал что-то :)