2017-01-31 3 views
0

Python/Programming beginner. Работа над разбором/извлечением данных из XML.Запись в XML - Отсутствующие линии

Цель: Возьмите неправильный xml (несколько xml-файлов в один файл .data) и напишите его в отдельные файлы xml. FYI - каждый XML начинается с той же декларации в файле, и в общей сложности 4.

подход (1) Я использую readlines() в файле (2) Найти индекс декларации каждого языка XML (3) перебирать фрагменты списка xml, записывая каждую строку в файл. Код ниже, извинения, если это отстой :)

For i, x in enumerate(decl_indxs): 
    xml_file = open(file, 'w') 
    if i == 4: 
     for line in file_lines[x:]: 
      xml_file.write(line) 
    else: 
     for line in file_lines[x:decl_indxs[i+1]]: 
      xml_file.write(line)  

Проблема Первые 3 XMLs создаются без проблем. Четвертый xml пишет только первые 238 из 396 строк.

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

Помощь Может кто-нибудь объяснить, почему это произойдет? Было бы также полезно получить советы по улучшению моего подхода. Чем больше информации, тем лучше. Спасибо

ответ

0

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

Насколько я понимаю ваш вопрос, вам нужно

  1. Используйте менеджер with контекста, чтобы открыть исходный файл с несколькими XMLs.
  2. Разделите содержимое исходного файла на несколько строковых переменных, основываясь на нахождении строки заголовка декларации <?xml.
  3. Напишите отдельные XML-строки для отдельных файлов, также используя диспетчер контекстов with.
  4. Если вам нужна дальнейшая работа с этими XML-файлами, вам обязательно нужно обратиться к специализированным синтаксическим анализаторам XML (xml.etree, lxml) и никогда не работать с ними, как со строками.

Пример кода:

def split_to_several_xmls(original_file_path): 
    # assuming that original source is correctly formatted, i.e. each line starts with "<" (omitting spaces) 
    # otherwise you need to parse by chars not by lines 
    with open(original_file_path) as f: 
     data = f.read() 
    resulting_lists = [] 
    for line in data.split('\n'): 
     if not line or not line.strip(): # ignore empty lines 
      continue 
     if line.strip().startswith('<?xml '): 
      resulting_lists.append([]) # create new list to write lines to new xml chunk 
     if not resulting_lists: # ignore everything before first xml decalartion 
      continue 
     resulting_lists[-1].append(line) # write current line to current xml chunk 
    resulting_strings = ['\n'.join(e) for e in resulting_lists] 
    # i.e. backwardly convert lines to strings - each one string is one valid xml chunk in the result 
    return resulting_strings 


def save_xmls(xml_strings, filename_base): 
    for i, xml_string in enumerate(xml_strings): 
     filename = '{base}{i}.xml'.format(base=filename_base, i=i) 
     with open(filename, mode='w') as f: 
      f.write(xml_string) 


def main(): 
    xml_strings = split_to_several_xmls('original.txt') # file with multiple xmls in one file 
    save_xmls(xml_strings, 'result') 


if __name__ == '__main__': 
    main() 
+0

Спасибо @Nikolay я дважды проверил мои показатели были правильными, и когда я распечатал кусочек он включал все данные. Но меня больше всего интересует улучшенная стратегия. Я просмотрел парсер XML, который вы упомянули, но не мог понять, как создать несколько деревьев из моего одного файла. Я мог получить дерево только для первого корня. При расследовании я столкнулся с советом по стеку, чтобы упростить вещи и написать его по строкам. –

+0

Была ли цель объединения строк xml в строку (result_strings) для повышения производительности при записи? Пропустили бы это и использование вложенных для result_lists в функции save_xmls было бы менее эффективным? –

+0

Да, синтаксические анализаторы - все о единых XML. Ваша задача - чистая работа со строками. То есть после того как ваша задача будет выполнена, и вы собираетесь справиться с результатом, вы хотите, чтобы парсер в 95% случаев. –

Смежные вопросы