为了账号安全,请及时绑定邮箱和手机立即绑定

为什么更改为“w+”模式同时读取和写入文件会导致读取失败?

为什么更改为“w+”模式同时读取和写入文件会导致读取失败?

动漫人物 2022-11-09 14:47:24
我正在用 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模式打开它。所以,请继续使用您的原始版本!


查看完整回答
反对 回复 2022-11-09
?
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)


查看完整回答
反对 回复 2022-11-09
  • 2 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信