【问题标题】:Python json.load(file) error with valid JSON带有有效 JSON 的 Python json.load(file) 错误
【发布时间】:2019-02-13 05:48:33
【问题描述】:

我有一个关于在 Python 中使用 json 库时遇到的问题。

我正在使用以下代码使用 json.load(file) 命令读取 json 文件:

import json

filename= '../Data/exampleFile.json'
histFile= open(filename, 'w+')
print(json.load(histFile))

根据我找到的某个网站,我尝试读取的 JSON 文件是有效的:a screenshot of that validation, because I'm new and still lack the reputation...

我收到的错误消息如下:

File ".\testLoad.py", line 5, in <module>
print(json.load(histFile))
File "C:\Users\...\Python\Python37\lib\json\__init__.py", line 296, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Users\...\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\...\Python\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\...\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

好的,所以我认为问题不是文件,而是 json.load(file) 在其他情况下对我有用。

遗憾的是,我无法自己弄清楚这个错误消息,所以如果有更多处理 Python-JSON 交互经验的人可以帮助我,那就太棒了。

【问题讨论】:

  • ...发布 JSON?
  • 我的超能力告诉我你的文件有一个UTF-8 BOM,你需要用encoding='utf-8-sig'打开它。
  • @jwodder:不。
  • @jwodder 我很确定json.load(甚至loads)处理UTF-8-sig;从那以后……无论哪个版本在 UTF-8 或 UTF-16 中添加二进制文件(和 bytes),它也处理 UTF-8-sig,甚至(尽管没有记录)处理以 UTF-8 打开的 UTF-8-sig 文件文本。

标签: python json python-3.x io


【解决方案1】:

您打开文件进行写作

histFile= open(filename, 'w+')
#                        ^^^^

w 模式首先截断文件,所以文件是空的(在这里文件也可以被读取并不重要,+ 对此负责,但是文件仍然被截断)。见open() function documentation

'w':打开写入,先截断文件)

其中没有要解析的 JSON 数据。这就是为什么异常告诉您在文件的最开始解析失败的原因:

Expecting value: line 1 column 1 (char 0)

第一行第一列没有数据。

如果您想打开一个文件进行读写而不先截断它,使用'r+'作为文件模式。

【讨论】:

  • 在这种情况下,'a' 作为开放模式是否等同于'r+'
  • @domochevski:不,某些操作系统不允许您在当前文件大小之前查找文件中的任何位置(因此您无法更改打开文件时存在的部分)。
  • 感谢您的精确。我没有考虑操作系统之间可能存在的差异。
  • 非常感谢!这解决了这个问题。我使用 w+ 是因为我想打开的文件可能必须先创建,但我想现在我将使用 try 语句来处理它。我确实阅读了 w+ 的这个描述,但一定已经完全阅读了告诉我关于截断的部分。 `w+'' 为读写打开。如果文件不存在,则创建该文件,否则将其截断。流位于文件的开头。 `
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2018-06-09
  • 1970-01-01
相关资源
最近更新 更多