這個問題在這里已經有了答案: 如何在 Python 中檢查檔案大小? (10 個回答) 昨天關門。
社區正在審查是否從昨天開始重新提出這個問題。
我正在用json.dump.
但我只想寫不超過 10KB 檔案大小的物件。
如何在寫之前估計一個物件的大小?
uj5u.com熱心網友回復:
這是我的看法。
我們從以下示例開始(取自此處,添加了一些額外內容以使其有趣):
sample_orig = """{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
},
"a little extra" : "∫???π???"
}"""
接下來,我們定義一個測驗函式來執行編碼并輸出大小:
def encode_sample(sample : str):
for encoding in ('ascii', 'utf8', 'utf16'):
filename = f'{encoding}.json'
encoded_sample = sample.encode(encoding=encoding, errors='replace')
with FileIO(filename, mode='wb') as f:
f.write(encoded_sample)
assert len(encoded_sample) == f.tell()
print(f'{encoding}: {f.tell()} bytes')
將assert證明如果我們處理的是(not ) ,則報告的大小len是相同的。如果沒有,跟注會加注。bytesstrAssertionError
我們將首先對原始樣本進行編碼:
encode_sample(sample_orig)
輸出:
ascii: 617 bytes
utf8: 627 bytes
utf16: 1236 bytes
接下來,我們運行它json.loads()并json.dumps()“優化”大小(即洗掉不必要的空白):
sample_reduced = json.dumps(json.loads(sample_orig))
encode_sample(sample_reduced)
輸出:
ascii: 455 bytes
utf8: 455 bytes
utf16: 912 bytes
評論:
OP 詢問“ [...] 用 json.dump 撰寫 python 物件”,因此通過洗掉空格進行的“優化”并不重要,但我將其保留了下來,因為它可能會使其他人受益。
編碼很重要。如果輸出僅包含 ASCII 字符,
ascii并且(默認值)將產生相同的檔案大小。utf8因為我在 JSON 末尾添加了一些額外內容,所以兩種編碼的檔案大小不同。當然utf16將是三者中最大的一個。如前所述,
len如果先對其進行編碼,則可以使用它來獲取物件的大小。
uj5u.com熱心網友回復:
將 JSON 轉換為字串,然后使用sys.getsizeof()。1024它以位元組為單位回傳大小,因此如果要將其與以千位元組為單位的閾值進行比較,則可以除以。
sys.getsizeof(json.dumps(object))
示例用法:
import json
import sys
x = '{"name":"John", "age":30, "car":null}'
y = json.loads(x)
print(sys.getsizeof(json.dumps(y))) # 89
編輯:
正如在這個執行緒中提到的,物件在記憶體中的大小更大。所以從大小中減去49以獲得更好的估計。
print(sys.getsizeof(json.dumps(y)) - sys.getsizeof(""))
uj5u.com熱心網友回復:
len(json.dumps(object))是測驗后的答案。
我在現有的 JSON 檔案上使用了下面的代碼,69961根據我的檔案瀏覽器,它的大小是位元組,下面的代碼。
import json
import os
with open("somejson.json") as infile:
data = json.load(infile)
print(len(json.dumps(data)))
with open("somejson.json", "w") as outfile:
json.dump(data, outfile)
print(os.path.getsize("somejson.json"))
輸出
69961
69961
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457520.html
標籤:Python json python-3.x 文件 尺寸
