Python3:拆分连接的XML文件

Python3:拆分连接的XML文件,xml,python-3.x,split,Xml,Python 3.x,Split,我有一个由连接的XML文件组成的大型文本文件,我将它们称为“XML子文件” 我知道每个新的XML部分都是从字符串开始的 <?xml version = "1.0"?> 目标是解析每个XML子文件,但作为第一步,我需要 我的想法是将文本文件拆分为单独的XML文件,然后进行解析。 其他想法 如何循环浏览文本文件并将其拆分?我不能将文件作为一个整体来阅读,因为它太大了,我不能在行上循环,因为从技术上讲,文件是一行,文件中没有换行符 你知道如何在Python3中解决这个问题吗 PS:看起来

我有一个由连接的XML文件组成的大型文本文件,我将它们称为“XML子文件”

我知道每个新的XML部分都是从字符串开始的

<?xml version = "1.0"?>
目标是解析每个XML子文件,但作为第一步,我需要

我的想法是将文本文件拆分为单独的XML文件,然后进行解析。 其他想法

如何循环浏览文本文件并将其拆分?我不能将文件作为一个整体来阅读,因为它太大了,我不能在行上循环,因为从技术上讲,文件是一行,文件中没有换行符

你知道如何在Python3中解决这个问题吗

PS:看起来这是一个类似的问题,但链接已经失效:


假设输入文件相当大,并且您可能不想将其完全加载到内存中,那么流式传输是有意义的

最佳的生成器是将文件中的传入行流在某些点(即,当一行等于拆分行时)拆分为块

这可以概括为一个函数,可以将任何iterable拆分为多个组。用于该任务,我们需要做的就是在点击split here值时增加一个索引,并将该索引用作组键:

from itertools import groupby

def split_chunks(values, split_val):
    '''splits a list of values into chunks at a certain value'''

    index = 0
    def chunk_index(val):
        nonlocal index
        if val == split_val:
            index += 1
        return index

    return groupby(values, chunk_index)
测试-让我们将数字列表拆分为0处的块:

印刷品

[0, 1, 2, 3] [0, 4, 5, 6] [0, 7, 8 ,9] 确保以正确的编码打开容器文件

由于生成器仅在您推进迭代时才工作,因此在处理当前树时,大型容器文件的读取会停止,因此内存使用率应该相当低,与输入文件大小无关

doc在这个场景中是一个生成器,这很好,因为它非常节省内存。但与列表不同的是,如果列表是文档中的第一行,则很难确定它是否为空

ET.fromstringlist对生成器很满意,但当它发现生成器为空时将抛出。但是,当XML中出现错误时,它也会抛出,因此我要做的是添加一个try:

或者,您可以提前拨打电话列表,然后检查是否有线路:

lines = list(doc)
if lines:
    tree = ET.fromstringlist(lines)

你的意思是你的子文件被实际的双引号和两个符号分隔开了吗?还是空行?不,全部在一行中,引号不表示新的子文件。每当我找到文本时,新的子文件就开始了。你打算在某个时候回到你的问题上来吗?就像charm thx一样工作
import xml.etree.ElementTree as ET

with open('large_container_file', 'r', encoding='utf8') as container_file:
    for doc_num, doc in split_chunks(container_file, '<?xml version="1.0"?>'):
        print(f'processing sub-document #{doc_num}')
        tree = ET.fromstringlist(doc)
try:
    tree = ET.fromstringlist(doc)
except:
    pass
lines = list(doc)
if lines:
    tree = ET.fromstringlist(lines)