😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。
🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。
前言
今天有读者跟我反馈一个问题:他在电脑d盘根目录创建了一个:json.py的python文件,打算练习一下json中的两个函数:loads()和dumps()。
但是运行了如下代码的时候,它竟然提示:AttributeError: module ‘json’ has no attribute ‘loads’,翻译成汉语的意思是:属性错误:json模块中没有loads属性(函数)。
import json
#json文本字符串
j ='''aa:''[{"password" : "123321","method" : "AES-256-CFB","protocol" : "auth_sha1_v4",
}]''
'''
js = json.loads(j)
print(js)
#json文本字符串
j ='''aa:''[{"password" : "123321","method" : "AES-256-CFB","protocol" : "auth_sha1_v4",
}]''
'''
js = json.loads(j)
print(js)
报错如下:
D:\>python json.py
Traceback (most recent call last):File "json.py", line 1, in <module>import jsonFile "D:\json.py", line 21, in <module>js = json.loads(j)
AttributeError: module 'json' has no attribute 'loads'
一、问题分析
在Python中,json模块是用于处理JSON数据的标准库之一。
它提供了将JSON编码为字符串(序列化)和将字符串解码为JSON(反序列化)的功能。然而,在使用json模块时,开发者可能会遇到AttributeError: module ‘json’ has no attribute 'loads’的错误。这意味着在尝试使用一个不存在的属性或方法。
二、可能的错误原因
错误的模块名称
可能是我们错误地引用了json模块。
错误示例:
import jsons # 错误:使用了错误的模块名
data = '{"key": "value"}'
jsons.loads(data) # 引发错误
错误的导入方式
在导入json模块时,使用了错误的导入方式。
错误示例:
from json import json # 错误:json不是模块,而是模块的属性
data = '{"key": "value"}'
json.loads(data) # 引发错误
三、 解决方案
如果都不是以上的错误点,那么大家可以试试下面的解决方案:
只要将我刚刚创建的json.py的文件改一下名字就可以了,比如说改成json1.py。只要别用json命名就可以了。
那为什么会出现这样的错误呢?
首先要了解python中import引入模块的原理机制。
当执行一行 from package import module as mymodule 命令时,Python解释器会查找package 这个包的module模块,并将该模块作为 mymodule 引入到当前的工作空间。
所以import语句主要是做了二件事:
- 查找相应的module
- 加载module到local namespace
在import的第一个阶段,主要是完成了查找要引入模块的功能。
查找时首先检查 sys.modules (保存了之前import的类库的缓存),如果module没有被找到,则按照下面的搜索路径查找模块:
- .py 所在文件的目录
- PYTHONPATH 中的目录
- python安装目录,UNIX下,默认路径一般为/usr/local/lib/python/
- 3.x 中.pth 文件内容
也就是说,当import json的时候,它会先搜索json.py所在目录有没有对应的模块,由于命名的json.py与json模块文件重名,所以会误以为自己创建的json.py即为json模块文件,所以会出现这样的错误。
所以以后需要注意以下几点:
- 确保在导入模块时使用正确的模块名,避免使用错误的模块或拼写错误。
- 在调用模块属性或方法时,使用正确的属性或方法名,避免拼写错误。
- 如果不确定模块的使用方法,查阅官方文档或使用IDE的自动完成功能来帮助确认正确的方法名。
- 在使用json模块进行序列化和反序列化时,确保传入的参数是字符串类型,因为json.loads和json.dumps都要求输入为字符串。
- 考虑到代码的可读性和维护性,推荐使用完整的导入语句(如import json)而不是从模块中直接导入函数。