1 回答

TA貢獻1847條經驗 獲得超7個贊
考慮到該文件很?。ǖ陀?1MB),使用下一個簡單的 Python 腳本就足夠了(對于如此小的數據來說速度會非常快)。
我使用了zipfile.ZIP_DEFLATED
zip 文件最常見的壓縮方式。zipfile.ZIP_STORED
如果您需要內部未壓縮的文件,您可以使用它?;蛘?zipfile.ZIP_BZIP2 和 zipfile.ZIP_LZMA 用于其他壓縮算法。僅需要為輸出/處理的 zip 設置壓縮類型,自動導出輸入 zip 壓縮。zipfile
,json
都是io
標準的python模塊,不需要安裝任何東西。
fin.zip
和fout.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)
添加回答
舉報