我正在用 Python 編寫代碼,需要通過 RFID 標簽注冊用戶并將該記錄寫入文件。我設法編寫了一個運行良好的函數:def register_user(self, rfid): with open(self._RECORDS_FILE_PATH, 'r') as infile: recordsData = json.load(infile) with open(self._RECORDS_FILE_PATH, 'w+') as outfile: newRecord = { "timestamp": int(round(time.time() * 1000)), "rfid": rfid } recordsData["recordsList"].insert(0, newRecord) json.dump(recordsData, outfile)但我想盡可能優化代碼,減少行數。因此,我決定使用它,w+因為它應該能夠同時讀取和寫入文件。這是“優化”的代碼:def register_user(self, rfid): with open(self._RECORDS_FILE_PATH, 'w+') as file: recordsData = json.load(file) newRecord = { "timestamp": int(round(time.time() * 1000)), "rfid": rfid } recordsData["recordsList"].insert(0, newRecord) json.dump(recordsData, file)“優化”代碼不起作用,它給出了這個錯誤:Traceback (most recent call last): File "/home/pi/accessControl/accessControlClasses/userInfoApi.py", line 57, in register_user_offline recordsData = json.load(outfile) File "/usr/lib/python2.7/json/__init__.py", line 291, in load **kw) File "/usr/lib/python2.7/json/__init__.py", line 339, in loads return _default_decoder.decode(s) File "/usr/lib/python2.7/json/decoder.py", line 364, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode raise ValueError("No JSON object could be decoded")ValueError: No JSON object could be decoded將保存記錄的文件:{"recordsList": []}有人能告訴我為什么會這樣嗎?
2 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
以模式打開文件會w+
截斷它,因此一旦您嘗試這樣做,就沒有什么可讀取的了。此模式旨在讓您在打開文件后返回并閱讀您所寫的內容。
由于您必須閱讀該文件,因此您需要以r
模式打開它。由于您想稍后替換整個內容,因此您必須截斷它并以w
模式打開它。所以,請繼續使用您的原始版本!

12345678_0001
TA貢獻1802條經驗 獲得超5個贊
正如蒂埃里所說,w+截斷文件——刪除數據——因此沒有可讀取的內容。
使用另一種讀/寫模式打開文件, r+-- 句柄設置為文件的開頭,然后添加一個f.seek(0),您的代碼將正常工作。
with open(self._RECORDS_FILE_PATH, 'r+') as f:
recordsData = json.load(f)
newRecord = {
"timestamp": int(round(time.time() * 1000)),
"rfid": rfid
}
recordsData["recordsList"].insert(0, newRecord)
f.seek(0) # go back to beginning of file
json.dump(recordsData, f)
添加回答
舉報
0/150
提交
取消