中文和坐标轴负号显示问题
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
ImportError: No module named xxx
当要导入不同目录的.py
文件,特别是单独测试某个.py
文件时,就很可能出现这类错误,这时先要看下被导入文件所在文件夹是否包含__init__.py
,
因为在python
中,每个.py
文件被称为“模块”,含有__init__.py
的目录被称为“包”,只要模块或者包所在的目录在sys.path
中,
就可以使用import
进行导入。
如果被导入文件不依赖其他自定义的.py
文件,即依赖关系简单,可用1
小节方法,否则参考2
小节。
1.引用module依赖关系简单
import sys
sys.path.append("此处为要导入的模块或包的路径")
注意: 因为程序可能在不同电脑运行,所以最好用相对路径(但用相对路径可能会引起另一个问题,具体参考2
小节)。
如果想指定搜索目录优先级,可以用insert
方法:
sys.path.insert(0, "此处为要导入的模块或包的路径")
该方法第一个参数为整型,数字越小表示优先级越高。另外不论append
还是insert
都是临时添加路径,程序结束后会自动清空,不会永远保存在sys.path
中。
2.引用module依赖关系复杂
上述方法偶尔也会出问题,请看下面的层次目录:
root_dir
|-- dir1
| |-- __init__.py
| |--------- a.py
|-- dir2
| | --dir2_1
| | |-- __init__.py
| | |--------- b.py
| | --dir2_2
| | |-- __init__.py
| | |--------- c.py
假如我们要单独测试运行a.py
,而其运行依赖于b.py
,b.py
运行又依赖于c.py
,那么我们按上述相对路径方法处理时就会报错,
因为在运行a时,当前工作目录为dir1
,而b
是按相对路径导入的c
,所以b
就会找不到c
中的module
,那么此时就可以试试下面的方法:
import os
#获取项目根目录的路径
root_path = os.path.abspath(os.path.dirname(__file__)).split('root_dir')[0]
sys.path.insert(0, root_path)
其中root_dir
为项目文件夹名字,当需要导入其他目录模块时:
from root_dir import xxx
from root_dir.xxx import xxx
json.decoder.JSONDecodeError: Expecting value: line 1 column xxx (char xxx)
如果错误为column 1 (char 0)
,则可能是传过来的json
字符串为空,如果column
和char
后面是其他数字,则可能是传过来的json
字符串中有不能解析的内容,以下面我碰到的情形为例:
#从本地读取json配置文件
with open('config/conf.json', 'r') as f:
json_str = str(json.load(f))
json_str = json_str.replace("'", '"') #把单引号替换为双引号,这句注释掉我这边会报错
json_str = json_str.replace("True", "true") #这句注释掉我这边报错
parsed_dict = json.loads(json_str) #将json字符串转换成python的字典数据格式
我的本地json
配置文件如下,仅作参考:
{
"auto_arima": {
"start_p": 1,
"start_q": 1,
"max_p": 12,
"max_q": 12,
"m": 12,
"seasonal": true,
"d": 1,
"stepwise": true
}
}