Python: 读写文件时的问题

问题描述 投票:1回答:2

我正在用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": []}

谁能告诉我为什么会出现这种情况?

python file writing
2个回答
2
投票

打开文件 w+ 模式会截断它,所以一旦你尝试这样做,就没有什么可读的了。这个模式是为了让你在打开文件后,可以回过头来读你写的东西。

由于你必须要读取文件,你需要在 r 模式。由于您以后要替换整个内容,您必须将其截断,并以 w 模式。所以,保持你的原始版本!


1
投票

正如Thierry所说 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)
© www.soinside.com 2019 - 2024. All rights reserved.