【问题标题】:Python JSON AttributeError: 'str' object has no attribute 'read'Python JSON AttributeError:“str”对象没有属性“read”
【发布时间】:2026-02-20 08:40:01
【问题描述】:

我是 Python 的初学者。 Python 3.7.6

import json
fil='numbers.json'
num=[]
with open(fil,'r') as file :
    for obj in file :
        num.append(json.load(obj))
print(num)

这是 JSON 文件:

"45""56""78""75"

这是我在运行代码时遇到的错误

Traceback (most recent call last):
  File "C:/Users/Dell/PycharmProjects/untitled/tetu.py", line 6, in <module>
    num.append(json.load(obj))
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

知道如何解决这个问题吗?

提前致谢

【问题讨论】:

  • 您帖子中的示例:"45""56""78""75" 绝对不是 JSON 格式。
  • 这甚至不是一个正确的 JSON 文件,而且还不清楚您希望代码如何工作,甚至超出此范围。 JSON 旨在一次加载,而不是逐行加载。任何给定的有效 JSON 文件行都可能不是有效的 JSON。
  • 您好,欢迎阅读,请阅读关于使用 JSON 的热门信息,w3schools.com/python/python_json.asp 您也可以在此处验证您的 JSON jsonlint.com/?code=
  • "line-by-line" JSON 存在:en.wikipedia.org/wiki/JSON_streaming#Line-delimited_JSON 和例如对于某种日志文件,它是一种合理的内部格式吗?

标签: python json python-3.x


【解决方案1】:

首先你的文件内容不是 json。

给定一个有效的json文件内容/tmp/a.json

{"a": 123}

json.load() 接受文件对象,如:

>>> import json
>>> with open('/tmp/a.json', 'r') as f:
...     data = json.load(f)
...     print(data)
... 
{'a': 123}

您的错误来自迭代文件对象,它将每一行读入字符串

>>> with open('/tmp/a.json', 'r') as f:
...     for i in f:
...             print(i.__class__)
... 
<class 'str'>

在这种情况下,您需要使用接受 json 字符串的json.loads()

>>> with open('/tmp/a.json', 'r') as f:
...     for i in f:
...             print(json.loads(i))
... 
{'a': 123}

【讨论】:

    【解决方案2】:

    暂且不说对非 json 文件使用 json 扩展名,您的代码的问题在于 obj 是代码中的字符串,而不是文件,因此您应该使用 json.loads 而不是 json.load .另一方面,如果你知道每一行都是一个数字,你可以将文字整数转换为int

    【讨论】:

      最近更新 更多