我在 Python 的課堂活動中遇到了一些問題。在這個活動中,我應該創建一個我應該為“小商店”創建一個系統,以便能夠注冊產品(在 JSON 檔案中),然后能夠加載檔案并使用相同的加載進行查詢。基本上,這項作業已完成 90%,但我一直在試圖弄清楚為什么我的產品記錄沒有保存在正確的 JSON 結構上。我不知道為什么 JSON 沒有在記錄前后保存帶有“[]”的專案。
global estoque
global contador_sinal
global carregar_flag
estoque = []
lista_produtos = [] # <--- HERE I CREATE THE LIST THAT RECEIVES PRODUCT REGISTRATIONS
contador_sinal = 0
contador = 0
carregar_flag = 0
class Produto: # <-- CREATING THE CLASS OF PRODUCTS
def __init__(self, codigo, nome, descricao, valor):
self.codigo = codigo
self.nome = nome
self.descricao = descricao
self.valor = valor
def gravar(): # <-- AND THIS IS THE FUNCTION THAT SAVES THE LIST PRODUCTS IN JSON
global contador_sinal
print("="*50)
print(" ","\nGravando Arquivo Externo dos Produtos...")
with open('data.json', 'w') as fp:
for item in lista_produtos:
if type(item) == Produto:
json.dump(item.__dict__, fp, indent=4)
fp.write("\n")
elif type(item) == dict:
json.dump(item, fp, indent=4)
time.sleep(1)
print(" ")
print("\033[32mARQUIVO SALVO COM SUCESSO!\033[0m\n")
fp.close()
contador_sinal = 1
return menu()
以下是保存后資訊在 JSON 上的顯示方式:
{
"codigo": 1,
"nome": "test1",
"descricao": "description",
"valor": 10.0
}
{
"codigo": 2,
"nome": "test2",
"descricao": "description",
"valor": 20.0
}
{
"codigo": 3,
"nome": "test3",
"descricao": "description",
"valor": 30.0
}
如果有人知道如何修復這種結構以及錯誤保存的原因,那將是一個巨大的幫助。
uj5u.com熱心網友回復:
import json
class Produto: # <-- CREATING THE CLASS OF PRODUCTS
def __init__(self, codigo, nome, descricao, valor):
self.codigo = codigo
self.nome = nome
self.descricao = descricao
self.valor = valor
lista_produtos = [Produto(1, "test1", "description", 10), Produto(2, "test2", "description", 20), Produto(3, "test3", "description", 30)]
def gravar(): # <-- AND THIS IS THE FUNCTION THAT SAVES THE LIST PRODUCTS IN JSON
global contador_sinal
print("=" * 50)
print(" ", "\nGravando Arquivo Externo dos Produtos...")
data = [item.__dict__ if type(item) == Produto else item for item in lista_produtos] # <-- NON PRODUTO ITEMS ARE EXPECTED TO BE A DICT
with open('data.json', 'w') as fp:
json.dump(data, fp)
print(" ")
print("\033[32mARQUIVO SALVO COM SUCESSO!\033[0m\n")
def main():
gravar()
if __name__ == "__main__":
main()
這會給出你想要的結果嗎?
uj5u.com熱心網友回復:
不可能有有效的 JSON、附加更多資料并獲得仍然有效的 JSON。這就是在回圈中分別保存每個字典(JSON 中的物件)的問題。
有幾種方法可以解決它:
在記憶體中創建一個 dicts 串列并將其保存為 JSON 一次。
只是為了完整性,因為它是一個黑客。分別在開頭和檔案末尾添加
[和,和]字符作為分隔符,創建一個JSON串列。我的建議:將檔案格式從 JSON 更改為換行符分隔的 JSON。在發布的代碼中,您需要更改的只是洗掉
indent=4引數。當然,讀取此類檔案的程式必須逐行讀取并單獨加載每個 JSON 行。那應該沒問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/353556.html
上一篇:基于天數(全天、半天),Python回合移動到可能的最高數字
下一篇:Python型別注釋理解問題
