1 Câu hỏi: Chia tệp XML lớn thành nhiều tệp

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đã cố tách một tệp XML lớn (65GB) bằng cách sử dụng đoạn mã sau nhưng phải mất một thời gian dài (tôi nghĩ vì nối chuỗi) định dạng XML giống như

<posts>
<row id= ....   />
<row id= ....   />
<row id= ....   />
<row id= ....   />
.
.
.
</posts>

from lxml import etree

context = etree.iterparse('Posts.xml', tag='row', events=('end', ))
index = 0
count = 0
full_text = b""
for event, elem in context:
    count += 1
    full_text += etree.tostring(elem)
    if count >= 1000000 :
        count = 0
        index += 1
        filename = format(str(index) + ".xml")
        with open(filename, 'wb') as f:
            f.write(b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
            f.write(b"<root>\n")
            f.write(full_text)
            f.write(b"</root>")
            full_text = b""
with open(format(str(index+1)+".xml"), 'wb') as f:
    f.write(b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
    f.write(b"<root>\n")
    f.write(full_text)
    f.write(b"</root>")

Tôi muốn chia nó thành các tệp 1GB để xử lý thêm

Có cách nào hiệu quả để biện minh cho đoạn mã sau không?

P.S. [Cùng chủ đề không giúp đỡ]

    
2
1 Câu trả lời                              1                         

Tôi không thể đưa bạn đến đó, nhưng dưới đây là cách tôi sẽ tiếp cận nó.

Tôi sẽ bắt đầu với:

from lxml import html
import lxml.etree as le

tree = html.fromstring(content) #content would be your whole file

Sau đó tôi sẽ đếm số lượng nút trong tree của bạn, theo cách này:

num_nodes = tree.xpath("count(//book)") #'book' in your case would be whatever the critical item is

Khi bạn có số đó, tôi sẽ quyết định số lượng tệp tôi sẽ chia các nút đó. Giả sử bạn có 12 nút và quyết định chia chúng thành 3 tệp, các nút 1-4 sẽ là file 1, 5-8 trong file 2, v.v.

Từ file 2 của bạn, bạn cần chọn các nút ở các vị trí được gán cho tree. Vì vậy, đối với tệp này:

file 2

Điều này sẽ chọn các nút có liên quan và tất cả các thẻ, văn bản, v.v.

Cuối cùng, bạn lấy từng mục và làm với nó những gì bạn sẽ:

low_pos=5
hi_pos=8
items = tree.xpath('//book[position()>=low_pos and position()<=hi_pos]')

Rõ ràng là sẽ mất rất nhiều công sức để thực hiện nó trong trường hợp của bạn, nhưng hy vọng nó ít nhất là một sự khởi đầu ...

    
0
2019-05-08 20: 32: 44Z
  1. #content sẽ là toàn bộ tệp của bạn - Toàn bộ tệp 65GB? Ôi. Ngoài ra, tại sao nên sử dụng html nếu các tệp đầu vào là XML?
    2019-05-08 20: 46: 28Z
  2. @ DanielHaley - có lẽ anh ta nên phân chia thủ công trước thành các phần nhỏ hơn ... Dù sao, đó là điều tốt nhất tôi có thể làm - chỉ cần cố gắng giúp anh ta.
    2019-05-08 20: 57: 39Z
    for item in items:
        print(le.tostring(item).decode('utf-8'))#or write or whatever
    
nguồn đặt đây