Python 重新编辑json文件时随机/空字符

Python 重新编辑json文件时随机/空字符,python,json,file-handling,Python,Json,File Handling,我为标题中对我的问题的模糊定义道歉,但我真的不知道我在处理什么样的问题。好了,就这样 我有一个python文件: edit-json.py 这个python脚本基本上创建一个文件rooms.json(如果它不存在),从json文件中获取数据(数组),清空json文件,然后最后将新数据写入文件。所有这些都是在函数add_rooms()中完成的,然后在脚本末尾调用该函数,非常简单 问题是,我只运行了一次文件,没有任何奇怪的事情发生,即创建了文件,其中的数据是: {"rooms":

我为标题中对我的问题的模糊定义道歉,但我真的不知道我在处理什么样的问题。好了,就这样

我有一个python文件: edit-json.py

这个python脚本基本上创建一个文件rooms.json(如果它不存在),从json文件中获取数据(数组),清空json文件,然后最后将新数据写入文件。所有这些都是在函数add_rooms()中完成的,然后在脚本末尾调用该函数,非常简单

问题是,我只运行了一次文件,没有任何奇怪的事情发生,即创建了文件,其中的数据是:

{"rooms": [{"name": "friends"}]}
但是当用户再次运行脚本时,会发生奇怪的事情。

我应该看到的:

{"rooms": [{"name": "friends"}, {"name": "friends"}]}
我看到的是:

很抱歉,由于某些原因,我无法复制收到的文本,因此不得不发布该图像。

显然,我不能再次运行脚本(第三次),因为json解析器由于这些字符而给出错误

我在一个在线编译器中获得了这个结果。在我的本地windows系统中,我得到了额外的空格,而不是那些额外的符号


我不知道是什么原因造成的。也许我没有错误地处理文件?还是因为json模块?还是只有我得到了这个结果?

当您截断文件时,文件指针仍然在文件的末尾。使用
f.seek(0)
移回文件的开头:

import os, json

def add_rooms(data):
    if(not os.path.exists('rooms.json')):
        with open('rooms.json', 'w'): pass

    with open('rooms.json', 'r+') as f:
        d = f.read()  # take existing data from file
        f.truncate(0)  # empty the json file
        f.seek(0)  #  <<<<<<<<< add this line
        if(d == ''): rooms = []  # check if data is empty i.e the file was just created
        else: rooms = json.loads(d)['rooms']
        rooms.append({'name': data['roomname'], 'active': 1})
        f.write(json.dumps({"rooms": rooms}))  # write new data(rooms list) to the json file

add_rooms({'roomname': 'friends'})
导入操作系统,json
def添加_房间(数据):
如果(不是os.path.exists('rooms.json')):
带open('rooms.json','w'):pass
将open('rooms.json','r+')作为f:
d=f.read()#从文件中获取现有数据
f、 截断(0)#清空json文件

f、 seek(0)#谢谢@Mike67我这么做了,这很有帮助。我使用f.tell()来查看截断文件后的位置,第二次我没有看到0作为位置。
import os, json

def add_rooms(data):
    if(not os.path.exists('rooms.json')):
        with open('rooms.json', 'w'): pass

    with open('rooms.json', 'r+') as f:
        d = f.read()  # take existing data from file
        f.truncate(0)  # empty the json file
        f.seek(0)  #  <<<<<<<<< add this line
        if(d == ''): rooms = []  # check if data is empty i.e the file was just created
        else: rooms = json.loads(d)['rooms']
        rooms.append({'name': data['roomname'], 'active': 1})
        f.write(json.dumps({"rooms": rooms}))  # write new data(rooms list) to the json file

add_rooms({'roomname': 'friends'})