亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 shell 腳本/ ANT 腳本/ java 代碼/ python 代碼修改 zip

如何使用 shell 腳本/ ANT 腳本/ java 代碼/ python 代碼修改 zip

牧羊人nacy 2023-07-27 09:57:18
我需要修改 zip 文件內的 json 文件內的 json 內容。zip 文件的層次結構是:abc.zip文件夾1數據庫配置配置1.xml配置2.xml文件文件夾JSON文件夾所有包含 json 對象的 json 文件jsonobjects.zip我需要使用與現有 json 格式不同的格式修改 json 對象。json 文件中現有的 JSON 對象是:{ "title":"xyz",  "type":"object", "properties":{ "id":"123", "name":"xyz"}}json 文件中應替換的新內容應為:{  "name":"xyz"  "type":"JSON"  "schema":{ // entire content of the existing JSON should be there in schema  "title":"xyz",   "type":"object",  "properties":{ "id":"123", "name":"xyz"}   }  "owner":"jack"}哪個簡單有效地完成這個任務(shellscript / python腳本/ java代碼)?
查看完整描述

1 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

考慮到該文件很?。ǖ陀?1MB),使用下一個簡單的 Python 腳本就足夠了(對于如此小的數據來說速度會非常快)。

我使用了zipfile.ZIP_DEFLATEDzip 文件最常見的壓縮方式。zipfile.ZIP_STORED如果您需要內部未壓縮的文件,您可以使用它?;蛘?zipfile.ZIP_BZIP2 和 zipfile.ZIP_LZMA 用于其他壓縮算法。僅需要為輸出/處理的 zip 設置壓縮類型,自動導出輸入 zip 壓縮。zipfile,json都是io標準的python模塊,不需要安裝任何東西。

fin.zipfout.zip是示例輸入/輸出 zip 文件名。您需要一個單獨的輸出/處理的 zip 文件,并且無法就地修改輸入 zip,因為 JSON 文件會更改其大小,并且輸入 zip 也可能被壓縮,因此需要重新打包/重新壓縮到另一個輸出 zip 文件。此外,輸入和輸出 zip 文件名可能相同,然后輸入文件將被替換,但在這種情況下,不要忘記備份 zip,直到您確定 zip 轉換沒有錯誤。

您可以看到對象被修改的行jdata,您可以根據任務需要的方式更改它們。jdata 從 json 解碼然后修改,然后編碼回 json。另請注意,如果您需要限制擴展條件,則整個層次結構中的所有 json 和 zip 文件都將被修改elif fname.endswith('.json')

看起來您已將拉鏈嵌套在另一個拉鏈內。這就是為什么我創建了一個單獨的ProcessZip()函數,以便遞歸地調用它來處理嵌套的 zip,它可以處理任何嵌套級別。

更新:我添加了 xml 到 json 轉換的示例。它需要xmltodict通過命令安裝模塊python -m pip install xmltodict。此外,由于 xml 可能以不同的方式轉換為 json(例如 json 沒有屬性),因此您可能還需要按照您需要的方式修復轉換后的內容。另請注意,從 xml 轉換后,我將壓縮文件擴展名從 更改.xml.json.

import zipfile, json, io

# Needs: python -m pip install xmltodict

import xmltodict


def ProcessZip(file_data):

    res = io.BytesIO()

    with zipfile.ZipFile(io.BytesIO(file_data), mode = 'r') as fin, \

         zipfile.ZipFile(res, mode = 'w', compression = zipfile.ZIP_DEFLATED) as fout:

        for fname in fin.namelist():

            data = fin.read(fname)

            if fname.endswith('.zip'):

                data = ProcessZip(data)

            elif fname.endswith('.json'):

                jdata = json.loads(data.decode('utf-8-sig'))

                # Check that we don't modify already modified file

                assert 'schema' not in jdata, 'JSON file "%s" already modified inside zip!' % fname

                # Modify JSON content here

                jdata = {

                    'name': 'xyz',

                    'type': 'JSON',

                    'schema': jdata,

                    'owner': 'jack',

                }

                data = json.dumps(jdata, indent = 4).encode('utf-8')

            elif fname.endswith('.xml'):

                jdata = xmltodict.parse(data)

                jdata = {

                    'name': 'xyz',

                    'type': 'JSON',

                    'schema': jdata,

                    'owner': 'jack',

                }

                data = json.dumps(jdata, indent = 4).encode('utf-8')

                fname = fname[:fname.rfind('.')] + '.json'

            fout.writestr(fname, data)

    return res.getvalue()


with open('fin.zip', 'rb') as fin:

    res = ProcessZip(fin.read())

with open('fout.zip', 'wb') as fout:

    fout.write(res)


查看完整回答
反對 回復 2023-07-27
  • 1 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號