python代码报错汇总

下面列出的问题都是自己在实践过程中遇到并解决的,但是只适合解决我当时的问题,放在有些情况下,可能就不适用啦!

1、pickle.load()读取文件错误

pickle文件比较不稳定,在读取的时候报错 ‘ascii’ codec can’t decode byte 0xb2 in position 2: ordinal not in range(128)。错误来源有很多种,其中一种可能是编码错误,比如下面这种,改变编码方式:

import pickle
with open("data\\squeeze_net\\model.pkl",'rb') as f:
    content = pickle.load(f,encoding='iso-8859-1')
print(content)

参考来源:pickle.load()读取文件错误

2、‘gbk’ codec can’t decode byte 0x93 in position 3136: illegal multibyte sequence

这是一种常见的编码错误,一般都是在打开文件的时候指定encoding=’XXX’,比如"utf-8",就可以解决。

3、AttributeError: module ‘sys’ has no attribute ‘setdefaultencoding’

这里有一段代码会报错,

reload(sys)
sys.setdefaultencoding("utf-8")
f = open('filename','rb')
str = f.read().decode('utf-8')
f.close()

Python3字符串默认编码unicode, 所以sys.setdefaultencoding也不存在了。直接删除sys.setdefaultencoding(“utf-8”)这一句就好了

4、 SyntaxError: positional argument follows keyword argument解决方法

出现这个bug的原因在于参数位置不正确(位置参数,有时也称必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致),关键字参数必须跟随在位置参数后面! 因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数。

5、UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xca in position 94: invalid continuation byte

line.strip().split(",") 改为 line.decode().strip().split(",")试一试

6、SyntaxError: Non-UTF-8 code starting with ‘\xb6’ in file XX.py

遇到编码问题的几种解决方案:

  1. 程序首行指定合适编码方式,比如在.py文件最前端加上①# coding:utf-8 或者 ②# -*- coding: utf-8 -*-,表示此文件在运行过程中不会自动更改编码方式,此时发现在pycharm右下角发现编码方式不可手动更改了。
  2. 打开文件比如open的时候指定编码方式
  3. 程序内部使用decode()函数等
7、jupyter notebook 换了kernel之后报错:DLL load failed.

把当前python脚本用到的虚拟环境下的Library/bin和Scripts添加到当前所用机器环境变量中去

8、为什么不推荐使用pickle

pickle 仅被推荐作为短期的存储格式。问题在于 pickle 很难确保格式的长期有效性;一个今天被 pickle 化的对象可能明天会因为库的新版本而无法反序列化。所以我遇到.pkl文件老是出问题😂,不喜欢pickle哈哈

9、运行python -m XXX.py,报错:NotImplementedError: Not sure how to parse XXX/test.csv. Please specify the file extension.

用python -m XXX.YYY.py运行的时候,一定要注意开始运行命令的目录对不对,比如这个一定要早XXX的同级目录下运行,如果cd XXX,再次运行python -m ,可能就要报错咯

10、cannot import name ‘XXX’

出现这种cannot import name 'XXX’的常见原因有:

  1. 导入包出现错误,尝试先卸载该包,再重新导入
  2. 导入文件的文件顺序。尝试从最外层文件夹依次导入。用绝对路径代替相对路径。找不到模块的原因,python2和3对import的处理不同,这里只说python3,它是绝对导入,import时必须要写上路径才可以找到模块。
    如A—>B A—>C 在B中要引用C模块,必须要写成 from A import C,直接写import C则就会提示 No module named C.
  3. 查看自己命名的文件名,与导入的库文件名是否重复。重复的话会产生冲突。Python在搜索路径的时候有个顺序,进入python环境,利用sys.path命令查看搜索环境的顺序。第一个空格代表当前目录,首先被搜索,然后是环境变量PYTHONPATH目录,python标准库目录,任何.pth包含的目录。
    所以,虽然代码没错,解释器也对,也能找到模块里的类,但就是用不了,因为它首先找到当前目录里面的文件,就不会再找到库里的模块了。
    不仅是文件名,变量名的取法也应该较讲究才对。
    比如我之前遇到一个问题,报错信息是:
    File “/home/zhangxy/anaconda3/envs/pyserini2/lib/python3.6/site-packages/transformers/tokenization_utils_base.py”, line 69, in from tokenizers import AddedToken
    ImportError: cannot import name ‘AddedToken’

报错是因为我之前在调试其他文件的时候,在根目录下引入了一个文件叫做tokenizer.py,而Error出现在tokenizer中,所以肯定是我的tokenizer.py影响了正常的tokenizer的使用,所以自定义的文件名最好不要和库中相同。【查看自己命名的文件名,与导入的库文件名是否重复】

### 常见 Python 编程错误汇总及解决方案 #### 错误一:缩进不一致 Python 使用缩进来定义代码块,如果混合使用制表符和空格可能会引发 `IndentationError` 或者逻辑上的混乱。 ```python def example(): print("This is correctly indented") # 正确的缩进方式 print("Outside the function") # 这里不应该有额外的缩进 ``` 为了防止此类问题发生,在编写代码时应保持统一的缩进风格,并建议只使用空格而不是制表符[^1]。 #### 错误二:忘记冒号 在定义函数、类、条件语句等结构体时未加冒号也会引起语法错误。例如: ```python if True # 应该加上 : pass # 后面的内容会被认为不属于 if 的分支部分 ``` 确保所有的控制流语句后面都跟随一个冒号可以有效避免这个问题。 #### 错误三:变量名拼写错误 当程序员不小心打错了变量名称,则会出现 NameError 提示找不到指定的名字。比如下面的例子中试图访问不存在于当前作用域内的变量 b 变量: ```python a = "hello" prit(b) # 'b' 是未定义的, 实际上应该是指向 a ``` 仔细检查并确认所使用的每一个标识符都是之前已经声明过的能够帮助减少这类失误的发生频率。 #### 错误四:列表越界索引 尝试获取超出范围之外的位置元素会导致 IndexError 。如下所示当我们试着去取 index=5 处的数据而实际上只有四个元素存在时就会抛出异常 : ```python my_list = ['a', 'b', 'c', 'd'] element = my_list[5] # 尝试访问第五个位置 (index 4), 超出了界限 ``` 始终记得先验证下标的合法性再执行相应的操作有助于规避此风险。 #### 错误五:除数为零 任何数值被0整除都会触发 ZeroDivisionError ,这通常是因为业务逻辑处理不当造成的。像这样简单的算术表达式就可能隐藏着潜在的风险 : ```python result = 1 / 0 # 不允许做这样的运算 ``` 提前做好输入参数的有效性校验工作可以在很大程度上预防这种状况出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值