錯誤
Traceback (most recent call last): File "json2mask.py", line 18, in <module> main() File "json2mask.py", line 13, in main data = json.load(open(jsonpath)) AttributeError: module 'json' has no attribute 'load'
單步運行是可以import json這個模塊的,而且之前運行時沒有問題的;
>>> import json >>> aa = json.load(open('./xxx_huanshi_20210512.json')) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'json' has no attribute 'load' >>> exit()
原因
目錄中有一個json命名的文件;最根本的原因是python搜索導入模塊的順序;
$ ls 20210512.xxx/ Readme.md xxx_huanshi_20210512.json json.py
首先我們要了解python中import引入模塊的原理機制。當我們執行一行 from package import module as mymodule 命令時,Python解釋器會查找package 這個包的module模塊,並將該模塊作為 mymodule 引入到當前的工作空間。所以import語句主要是做了二件事:
a) 查找相應的module
b) 加載module到local namespace
在import的第一個階段,主要是完成了查找要引入模塊的功能。查找時首先檢查 sys.modules (保存了之前import的類庫的緩存),如果module沒有被找到,則按照下面的搜索路徑查找模塊:
a) .py 所在文件的目錄
b) PYTHONPATH 中的目錄
c) python安裝目錄,UNIX下,默認路徑一般為/usr/local/lib/python/
d) 3.x 中.pth 文件內容
也就是說,當我們import json的時候,它會先搜索json.py所在目錄有沒有對應的模塊,由於我們命名的json.py與json模塊文件重名,所以會誤以為我們自己創建的json.py即為json模塊文件,所以會出現這樣的錯誤。
解決方法
更改json.py文件的名稱;
參考
1. Python錯誤:AttributeError: module 'json' has no attribute 'loads'解決辦法;
完