1

10 万行を超える txt ファイルがあり、各行に対して XML ツリーを作成したいと考えています。しかし、すべての行が同じルートを共有しています。

ここにtxtファイル:

LIBRARY:
1,1,1,1,the
1,2,1,1,world
2,1,1,2,we
2,5,2,1,have
7,3,1,1,food

望ましい出力:

   <LIBRARY>
    <BOOK ID ="1">
        <CHAPTER ID ="1">
            <SENT ID ="1">
                <WORD ID ="1">the</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
    <BOOK ID ="1">
        <CHAPTER ID ="2">
            <SENT ID ="1">
                <WORD ID ="1">world</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
    <BOOK ID ="2">
        <CHAPTER ID ="1">
            <SENT ID ="1">
                <WORD ID ="2">we</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
    <BOOK ID ="2">
        <CHAPTER ID ="5">
            <SENT ID ="2">
                <WORD ID ="1">have</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
    <BOOK ID ="7">
        <CHAPTER ID ="3">
            <SENT ID ="1">
                <WORD ID ="1">food</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
</LIBRARY>

txtファイルをxmlファイルに変換するために要素ツリーを使用します。これは私が実行するコードです

def expantree():
  lines = txtfile.readlines()
  for line in lines:
    split_line = line.split(',')
    BOOK.set( 'ID ', split_line[0])
    CHAPTER.set( 'ID ', split_line[1])
    SENTENCE.set( 'ID ', split_line[2])
    WORD.set( 'ID ', split_line[3])
    WORD.text = split_line[4]
    tree = ET.ElementTree(Root)
    tree.write(xmlfile)

さて、コードは機能していますが、目的の出力が得られませんでした。次の結果が得られました。

<LIBRARY>
    <BOOK ID ="1">
        <CHAPTER ID ="1">
            <SENT ID ="1">
                <WORD ID ="1">the</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
</LIBRARY>
<LIBRARY>
    <BOOK ID ="1">
        <CHAPTER ID ="2">
            <SENT ID ="1">
                <WORD ID ="1">world</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
</LIBRARY>
<LIBRARY>
    <BOOK ID ="2">
        <CHAPTER ID ="1">
            <SENT ID ="1">
                <WORD ID ="2">we</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
</LIBRARY>
<LIBRARY>
    <BOOK ID ="2">
        <CHAPTER ID ="5">
            <SENT ID ="2">
                <WORD ID ="1">have</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
</LIBRARY>
<LIBRARY>
    <BOOK ID ="7">
        <CHAPTER ID ="3">
            <SENT ID ="1">
                <WORD ID ="1">food</WORD>
            </SENT>
        </CHAPTER>
    </BOOK>
</LIBRARY>

ツリーの root を統一する方法は?

4

3 に答える 3

0

1 つの方法は、完全なツリーを作成して印刷することです。次のコードを使用しました。

from lxml import etree as ET

def create_library(lines):
    library = ET.Element('LIBRARY')
    for line in lines:
        split_line = line.split(',')
        library.append(create_book(split_line))
    return library

def create_book(split_line):
    book = ET.Element('BOOK',ID=split_line[0])
    book.append(create_chapter(split_line))
    return book

def create_chapter(split_line):
    chapter = ET.Element('CHAPTER',ID=split_line[1])
    chapter.append(create_sentence(split_line))
    return chapter

def create_sentence(split_line):
    sentence = ET.Element('SENT',ID=split_line[2])
    sentence.append(create_word(split_line))
    return sentence

def create_word(split_line):
    word = ET.Element('WORD',ID=split_line[3])
    word.text = split_line[4]
    return word

次に、ファイルを作成するコードは次のようになります。

def expantree():
    lines = txtfile.readlines()
    library = create_library(lines)
    ET.ElementTree(lib).write(xmlfile)

ツリー全体をメモリにロードしたくない場合 (10 万行以上あるとおっしゃいました)、手動でタグを作成し、各本を一度に 1 つずつ書き込んでから、タグを追加できます。この場合、コードは次のようになります。

def expantree():
    lines = txtfile.readlines()
    f = open(xmlfile,'wb')
    f.write('<LIBRARY>')
    for line in lines:
        split_line = line.split(',')
        book = create_book(split_line)
        f.write(ET.tostring(book))
    f.write('</LIBRARY>')
    f.close()

私は lxml の経験があまりないので、もっと洗練された解決策があるかもしれませんが、これらは両方ともうまくいきます。

于 2013-07-22T18:19:10.900 に答える