簡體   English   中英

使用 python 在 .json 文件中存儲數據的所有不同方式是什么?

[英]What are all the different ways of storing data in a .json file using python?

我目前一直在為我的 discord.py 機器人開發警告系統。 我一直做得很好,直到我意識到我不知道如何添加到文件而不是覆蓋文件。 我不想添加到文件的末尾,因為我希望它按 discord 公會分類,然后是公會成員。 因此,當有人想要檢查他們的警告時,它只會在調用命令的特定行會中顯示他們的警告。我的問題是將信息存儲到.json文件的所有不同方式是什么?

例如: warn_list[str(ctx.guild.id)][member.id].add({stuff in here})

如示例所示,我不想知道存儲 aka 'a''w'等的不同模式。 我想知道,如果有的話,可以在最后添加什么。 .append().add() 我在 google 上查找了一個列表,但找不到我要查找的信息。 任何幫助將非常感激。

真誠的,killrebeest

如何添加持久化到 JSON 的自定義數據

您正在添加到字典,因此您將使用dict[key] = value添加數據,並使用value = dict[key]讀取數據1 要添加到list的末尾,請使用append()

你和你所擁有的很接近。 讓我們重構一下頭腦清晰:

warns_for_a_user = warn_list[str(ctx.guild.id)][member.id]

我們可以直接使用這個字典來存儲關於這個member.id的警告信息。 我們需要一個數據結構,我認為list符合要求(或dict )。 您可能需要這些警告中的時間信息,而時間似乎是一個合理的排序順序和/或主鍵。

我想知道,如果有的話,可以在最后添加什么

通常不會直接修改.json文件。 修改.json文件的唯一可靠方法是將整個內容導入 memory,然后在修改后將其保存回.json

.json文件視為及時的照片或快照。 如果場景發生了變化,您只需扔掉舊照片並拍攝另一張照片; 如果 state 已更新,我們只需丟棄舊的warnings.json 。json 並創建一個新的warnings.json 。json。

第 1 步:將新字段和 Append 添加到新字段

鑒於我們有關於最新warning的信息,我們可以將其保存到用戶的歷史記錄中:

# working with givens:
warning = { "type": "spam", "count": "20", "timestamp": 1612756912.987963 }

if not history in warns_for_a_user:
    warns_for_a_user['history'] = []
warns_for_a_user['history'].append([warning['timestamp'], warning])

您添加的這些新字段不應與任何內容沖突,因為它們是其他代碼部分未知的定制字段。

如果您發現將每個警告包裝在時間戳中很復雜,那是因為它是。 但是,通常選擇單個字段(或字段組合)作為整個 object 的代表鍵。 這有助於人類直接讀取 json 文件,也可以簡化處理邏輯。

第 2 步:讀取新字段數據

稍后,用戶想要查看他的警告。 以下內容一次打印一個警告(來自SO的日期時間代碼):

import datetime
for epoch_time, warn in warns_for_a_user['history']:
    _datetime = datetime.datetime.fromtimestamp(epoch_time)
    _human_datetime = _datetime.strftime('%Y-%m-%d %H:%M:%S')
    print(f"{_human_datetime}: [{warn['count']}x] {warn['type']}")

Output:

2021-02-07 20:01:52: [20x] spam

支持的數據類型

JSON 編碼器文檔具有如何將序列化的 JSON 數據轉換為反序列化的 python 對象的映射 請注意,它將元組轉換為列表。

檢查warnings.json

如果您按照我的示例進行操作,您應該會在warnings.json中的相應用戶下看到以下內容:

{"history": [[1612756912.987963, {"count": 20, "type": "spam", "timestamp": 1612756912.987963}]]}

1方括號表示法是__getitem__()__setitem__()的語法糖

暫無
暫無

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

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