Fork me on GitHub

至简

Be simple

为了寻找你,我把自己搬进鸟的眼睛,经常盯着路过的风。


Python问题汇总


中文和坐标轴负号显示问题

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.pyb.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字符串为空,如果columnchar后面是其他数字,则可能是传过来的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
	}
}