簡體   English   中英

打開一個 zip 文件並在 zip 文件中流式傳輸 xml 文件

[英]Open a zip file and stream the xml file inside of the zip file

我正在嘗試從 USPTO打開批量數據 zip 文件中的 xml 文件是包含多個 xml 聲明的串聯 xml 文件,並且非常大。 我試圖只從 xml 中讀取行,直到我到達下一個 xml 聲明。 我發現了這個相關的問題,沒有代碼。

我要創建的是一個執行以下操作的函數:

  1. 對於每個 *.zip 文件
  2. 提取所有 xml 文件(或打開 xml 文件進行讀取)
  3. 從 xml 文件中讀取行
  4. 追加每一行直到下一個 xml 聲明
  5. 返回字符串

到目前為止,我已經能夠打開 zip 文件,找到所有 xml 文件並提取每個 xml 文件。 我寧願不將 xml 文件寫入磁盤,而是創建一個字符串,該字符串是一個單獨的 xml 文檔,然后我進一步解析。

def main():
path = 'bulk/'
allFiles = glob.glob(path + '*.zip')
allFiles.sort()

for file in allFiles:
    try:
        with zipfile.ZipFile(file, mode = 'r', allowZip64 = True) as fin:
            print(fin, '- ok')
            print(fin.namelist())
            for name in fin.namelist():
                if name.endswith('xml'):
                    print(name) # all files that end in 'xml'
                    fin.extract(name, path='bulk/')
                    print('extracted ', name)
                    # TODO function to read lines of the xml file and




    except zipfile.BadZipFile:
            print(file,'- Bad zip file')

if __name__ == '__main__': main()

使用read而不是extract 它返回 zip 中文件的字節,給定名稱。 重要的是要了解您實際上是將存檔提取到內存中,因此請注意實際要提取的數據量以及您在這方面的限制。

例如,以下函數返回一個字典,以 zip 存檔文件的名稱作為鍵,文件的內容作為值:

from zipfile import ZipFile

def extract(f):
    zf = ZipFile(f)
    return {name: zf.read(name) for name in zf.namelist()}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM