这似乎是一个非常简单的问题,我试图读取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:无法解码JSON对象
为什么?令我感到惊讶的是json
模块无法解析模块本身创建的文件。
答案 0 :(得分:3)
根据您提供的代码以及您尝试执行的操作(将文件光标返回到文件的开头),您实际上并没有使用f.truncate
执行此操作。您实际上截断您的文件。即完全清除文件。
根据help
方法的truncate
:
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(...)
seek(offset[, whence]) -> None. Move to new file position.
因此,明确地说,回到您想要的文件的开头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()
。
答案 1 :(得分:1)
您缺少一行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)