Python 我的程序有时会在json文件的数据末尾额外写入一个]或}?

Python 我的程序有时会在json文件的数据末尾额外写入一个]或}?,python,json,list,file,dictionary,Python,Json,List,File,Dictionary,我已经为自己编写了一个记笔记工具,作为我的第一个程序。实际上,它在大多数情况下都工作得很好,但是有时程序会在所述json文件中存储的列表或dict末尾额外编写一个]或 这种情况并不经常发生,我认为只有在我编写新的代码行或更改读/写上述文件的现有行时才会发生。我不是100%确定,但这就是它看起来的样子 例如,我在一个文件中存储了一个列表,我使用indent=”“标志,以确保在写入文件时,如果我必须编辑所述文件,它对我来说更具可读性。有时,在修改代码或添加代码后运行程序时,会出现一个错误,指出文件中

我已经为自己编写了一个记笔记工具,作为我的第一个程序。实际上,它在大多数情况下都工作得很好,但是有时程序会在所述json文件中存储的
列表
dict
末尾额外编写一个
]

这种情况并不经常发生,我认为只有在我编写新的代码行或更改读/写上述文件的现有行时才会发生。我不是100%确定,但这就是它看起来的样子

例如,我在一个文件中存储了一个
列表
,我使用
indent=”“
标志,以确保在写入文件时,如果我必须编辑所述文件,它对我来说更具可读性。有时,在修改代码或添加代码后运行程序时,会出现一个错误,指出文件中有“额外数据”。 错误如下所示:

    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 6 column 2 (char 5791)
[
"Help",
"DataTypes",
"test",
"Variables",
]] # the error would be cause by this extra ] at the end of the list
错误的原因是这样的:

    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 6 column 2 (char 5791)
[
"Help",
"DataTypes",
"test",
"Variables",
]] # the error would be cause by this extra ] at the end of the list
我不明白的是,为什么程序有时会在json文件中的数据末尾添加额外的]或}

当我打开文件或转储到文件时,是否有错误

以下是我拥有的用于打开文件和转储到文件的部分代码:

path = "./NotesKeys/"
notebook = dict()
currentWorkingLib = ""
currentWorkingKeys = ""
#~~~~~~~~~~~~~~~~~~~< USE TO open all files in Directory >~~~~~~~~~~~~~~~~~~~
with open("%s%s"%(path,"list_of_all_filenames"), "r") as listall:
    list_of_all_filenames = json.load(listall)

def openAllFiles(event=None):
    global path
    for filename in os.listdir(path):
        with open(path+filename, "r+") as f:
            notebook[filename] = json.load(f)
openAllFiles()
我知道如何打开文件并使用数据,以及如何将数据转储到所述文件,并根据新转储的数据更新程序变量中加载的内容


在这个过程中我是否遗漏了一些重要的东西?我应该做些什么来确保json文件中的数据完整性吗

您正在以读写模式打开文件,
r+

with open("%s%s"%(path,currentWorkingLib),"r+") as working_temp_var:
这意味着您将要写入一个已经包含数据的文件,有时现有数据比您现在写入的文件长。这意味着您将在最后得到一些后续数据

您可以通过在文件中写入较短的演示字符串,然后使用
r+
在同一文件中写入较少的数据,然后再次读取:

>>> with open('/tmp/demo', 'w') as init:
...     init.write('The quick brown fox jumps over the lazy dog\n')
...
44
>>> with open('/tmp/demo', 'r+') as readwrite:
...     readwrite.write("Monty Python's flying circus\n")
...
29
>>> with open('/tmp/demo', 'r') as result:
...     print(result.read())
...
Monty Python's flying circus
r the lazy dog
不要这样做。使用
w
写入模式,首先截断文件:

with open("%s%s"%(path,currentWorkingLib), "w") as working_temp_var:

这可以确保在编写新的JSON文档之前,您的文件被缩减到0大小。

@TankorSmash基本上是一个@TankorSmash删除了有意义的无关内容ahh。我试试看。我无法真正测试它,因为我不确定是什么触发了问题,因为它感觉有点随机,但看起来确实是正确的解决方案。谢谢你的意见。这应该能奏效D@SierrMountainTech:触发条件是首先编写一个JSON对象,然后再编写一个JSON对象,其中包含较少的数据。由一个字符的外观。如果您知道要向对象中输入多少数据,那么应该很容易触发;多投入,少投入,这是有道理的。当我查看笔记时,某些文件可能会不时被删除。然而,正在写入的一些数据是对现有数据(主要是flie_名称列表)的刷新,并且只会变得更长。它永远不会变短。我还没有在程序中创建删除文件的函数。有时,这个列表也会遇到同样的问题。