Python使用过程问题记录

目录

cv2.imread 和scipy.misc.imread的区别

获取当前运行脚本的路径

终端运行python程序的import module的问题

module 'scipy.misc' has no attribute 'imread'

显示中文乱码的问题

递归太多,程序运行时爆炸

 

cv2.imread 和scipy.misc.imread的区别

cv2.imread读出来的图片是BGR格式的numpy.arrayscipy.misc.imread读出来的图片是RGB格式的numpy.array

因为都是numpy.array,所以scipy.misc.imread读出来的图片可以用cv2.imwrite直接保存。

而很神奇的是,cv2.imread读出来的图片直接用cv2.imwrite保存的图片颜色会失真,因为cv2.imwrite会把接收的矩阵以RGB格式写入图片,这就和cv2.imread不配套了。刚开始学openCV的时候这里特别容易乱。

解决方法是,cv2.imread读出来的图片要用cv2.imwrite保存前,先用cv2.cvtColor函数把BGR图像转为RGB才可以看到正常颜色的图片。

import cv2
img = cv2.imread('img path')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite('save img path', img)

此外,scipy.misc.imread对处理图片的size有一定要求,实际使用时我遇过一个错误信息提示我图片尺寸太大,scipy.misc.imread无法处理,改用cv2.imread就好了,令我哭笑不得。

获取当前运行脚本的路径

sys.path[0]获取的是调用该脚本文件的路径,比如有一个test.py文件调用了cfg.py文件,在cfg.py文件中用sys.path[0]获取的是test.py文件文件的所在的文件夹路径

若要获取cfg.py文件的路径,需要在cfg.py文件用下面这条语句

pathOfCfg = os.path.split(os.path.realpath(__file__))[0]

终端运行python程序的import module的问题

终端跑程序的时候,sys.path中的系统路径和在IDLE中跑的时候是不一样的,往往IDLE中可以跑通的代码在终端是跑不通的。

在IDLE中跑的时候,sys.path中既有当前IDLE所打开的最上层的文件夹的路径,也有当前要跑的子文件夹中程序的路径。

而在终端跑的时候,sys.path中只有当前要跑的子文件夹中程序的路径,这时如果你要import上一级目录下的文件,就会报错说找不到。

这个问题有两个解决方法:

1、在要跑的子文件夹的程序中,给系统路径加入上级目录的绝对路径

import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..‘)

__file__ 是该运行的程序的绝对路径,os.path.dirname是获取该绝对路径的文件夹路径(去掉basename)

'..' 的意思就是跳到上一级目录(单个点是当前目录,'../..'是上两级目录 )

这样就可以在项目的最上级目录直接跑子文件中的程序了。

2、第2种方法是进入子文件夹中,把上一级文件夹的相对路径添加到系统路径中

import sys
sys.path.append('..’)

这时终端就只能在子文件夹中跑代码了,毕竟系统路径中对上一层文件夹的路径搜索只能从该子文件夹出发,通过相对路径'..'找到上一级文件夹。

module 'scipy.misc' has no attribute 'imread'

pip install scipy==1.2.1

显示中文乱码的问题

python有自带的可以显示中文的习题,不用专门去下载SimHei Font。

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

递归太多,程序运行时爆炸

在列表数超过1100多行之后,由于列表数据经过的子函数太多,造成了递归引用爆炸的问题。

这个问题的归因在于列表的传参和取值是一个引用的过程,如果列表传入一个函数,然后在函数内部又取部分列表数据传入下一个函数……如此递归,数据量一多就会爆炸。

解决这个问题可以在一些不需要用引用来同步改变列表值的地方,用深拷贝deepcopy来将引用断掉。

UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 1022-1023: unexpected end of data

这个问题的起因是我用了中文人名当作了dict的key,正常运行的时候是没有问题的,但是debug的时候如果想点开dict一探究竟就会断开报上述错误。

解决方法是在用人名做key的时候用‘人名’.encode("utf-8")将人名编码存入,虽然debug的时候看着很奇怪,但是起码不会报错,是系统喜欢的样子。

 

qt.qpa.plugin: Could not load the Qt platform plugin "xcb"

装QT环境时出现这个错误,试了很多网上的方法,终于找到一个简单且有效的。

其实只需要把 libqxcb.so 这个链接库写进环境变量就好。

envpath = '/home/xier/anaconda3/envs/QT/lib/python3.6/site-packages/cv2/qt/plugins/platforms'
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = envpath

把以上这两句代码写进要运行的py文件中就解决问题了。

json.load出现'str' object has no attribute 'load'

一个简单的json.load竟然会出现这样的问题,其实原因也比较傻,就是json其实是一个包(需要import json)。

而我在写代码的时候把一个str变量也命名为json,发生了冲突,所以出现了str 对象没有load这个功能的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值