Python无法加载由创建的JSONjson.dump文件

2024-04-25 22:48:44 发布

您现在位置:Python中文网/ 问答频道 /正文

这似乎是一个非常简单的问题,我试图读取一个JSON文件并修改一些字段。在

with open("example.json", "r+") as f:
    data = json.load(f)
    # perform modifications to data
    f.truncate(0)
    json.dump(data, f)

在我第一次手动创建一个JSON文件并存储正确的JSON文件时,它起作用了,但是当我第二次运行同一个脚本时,它给了我一个错误:

ValueError: No JSON object could be decoded

为什么?令我惊讶的是,json模块无法解析模块本身创建的文件。在


Tags: 模块文件tojsondataexampleaswith
2条回答

根据您提供的代码,以及您正在尝试做的事情(将文件光标返回到文件的开头),您实际上并没有使用f.truncate来执行此操作。你实际上是在截短文件。i、 e.完全清除文件。在

根据truncate方法上的help

truncate(...)
    truncate([size]) -> None.  Truncate the file to at most size bytes.

    Size defaults to the current file position, as returned by tell().

将光标返回到文件开头的实际操作是使用seek。在

seek帮助:

^{pr2}$

因此,显式地返回到您想要的文件的开头f.seek(0)。在

为了提供一个正在发生的事情的例子。以下是truncate的情况:

文件中包含以下内容:

>>> with open('v.txt') as f:
...  res = f.read()
...
>>> print(res)
1
2
3
4

调用truncate并查看该文件现在将为空:

>>> with open('v.txt', 'r+') as f:
...  f.truncate(0)
...
0
>>> with open('v.txt', 'r') as f:
...  res = f.read()
...
>>> print(res)

>>>

使用f.seek(0)

>>> with open('v.txt') as f:
...  print(f.read())
...  print(f.read())
...  f.seek(0)
...  print(f.read())
...
1
2
3
4



0
1
2
3
4


>>>

第一个输出之间的长间隙显示光标位于文件末尾。然后我们调用f.seek(0)(这个0输出来自f.seek(0)调用),并输出我们的f.read()。在

您缺少一行,f.seek(0)

with open("example.json", "r+") as f:
    data = json.load(f)
    # perform modifications to data
    f.seek(0);
    f.truncate(0)
    json.dump(data, f)

相关问题 更多 >

    热门问题