load vs loads dump vs dumps
json
模組包含用於讀取和寫入 unicode 字串以及讀取和寫入檔案的函式。這些由函式名稱中的尾隨 s
區分。在這些示例中,我們使用 StringIO 物件,但相同的函式將適用於任何類檔案物件。
這裡我們使用基於字串的函式:
import json
data = {u"foo": u"bar", u"baz": []}
json_string = json.dumps(data)
# u'{"foo": "bar", "baz": []}'
json.loads(json_string)
# {u"foo": u"bar", u"baz": []}
在這裡我們使用基於檔案的功能:
import json
from io import StringIO
json_file = StringIO()
data = {u"foo": u"bar", u"baz": []}
json.dump(data, json_file)
json_file.seek(0) # Seek back to the start of the file before reading
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
json_file.seek(0) # Seek back to the start of the file before reading
json.load(json_file)
# {u"foo": u"bar", u"baz": []}
正如你所看到的,主要區別在於轉儲 json 資料時必須將檔案控制代碼傳遞給函式,而不是捕獲返回值。另外值得注意的是,你必須在讀取或寫入之前尋找檔案的開頭,以避免資料損壞。開啟檔案時,游標位於 0
的位置,因此下面也可以:
import json
json_file_path = './data.json'
data = {u"foo": u"bar", u"baz": []}
with open(json_file_path, 'w') as json_file:
json.dump(data, json_file)
with open(json_file_path) as json_file:
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
with open(json_file_path) as json_file:
json.load(json_file)
# {u"foo": u"bar", u"baz": []}
有兩種處理 json 資料的方法允許你習慣性地和有效地使用構建在 json 上的格式,例如 pyspark
的 json-per-line:
# loading from a file
data = [json.loads(line) for line in open(file_path).splitlines()]
# dumping to a file
with open(file_path, 'w') as json_file:
for item in data:
json.dump(item, json_file)
json_file.write('\n')