Python无法加载json.dump创建的JSON

时间:2017-07-18 00:14:25

标签: python json

这似乎是一个非常简单的问题,我试图读取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模块无法解析模块本身创建的文件。

2 个答案:

答案 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)