Python: проблема при чтении и записи файла - PullRequest
1 голос
/ 07 мая 2020

Я пишу код в 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 ]

2 голосов
/ 07 мая 2020

Открытие файла в режиме w+ обрезает его, поэтому читать нечего, как только вы попытаетесь это сделать. Этот режим предназначен для того, чтобы вы могли go вернуться и прочитать то, что вы написали после открытия файла.

Поскольку вам нужно будет прочитать файл, вам нужно открыть его в режиме r. Поскольку позже вы захотите заменить весь контент, вам придется его обрезать и открывать в режиме w. Так что оставайтесь с оригинальной версией!

1 голос
/ 07 мая 2020

Как сказал Тьерри, 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...