写入XML - 缺少行

时间:2017-01-31 05:15:17

标签: python xml python-3.x

Python /编程初学者。致力于从XML解析/提取数据。

目标:获取格式错误的xml(一个.data文件中的多个xml文件)并将其写入单个xml文件。仅供参考 - 每个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没有问题。第4个xml仅写入396行中的前238个。

疑难解答我修改了代码以打印出用于最终循环的列表切片,这很好。我还通过第四个列表切片循环,它输出正确。

帮助任何人都可以解释为什么会这样吗?获得改善我的方法的建议也很棒。信息越多越好。谢谢

1 个答案:

答案 0 :(得分:0)

我不认为你找到索引的方法是好的,很可能你搞砸了索引。好消息是,它实际上并不容易调试,因为有很多无意义的整数值。我会尝试在这里为你提供一些有用的方法。

据我所知,你需要

  1. 使用with上下文管理器打开包含多个XML的原始文件。
  2. 根据查找已知的声明标题字符串<?xml,将原始文件的内容拆分为多个字符串变量。
  3. 还使用with上下文管理器将单个XML有效字符串写入单个文件。
  4. 如果你需要进一步使用这些XML,你肯定应该寻找专门的XML解析器(xml.etreelxml),而不是像字符串那样使用它们。
  5. 代码示例:

       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()