1. csv.Error: line contains NULL byte
- 可能的原因: 文件包含空字符串: “\0” or “\x00”
- 可行的解决方案:把出错的文件中所有的行全部都去掉\0和\x00字符串。
with open(csv_file, 'rb') as fin:
reader = csv.reader((line.replace('\0', '').replace('\x00', '') for line in fin))
2. UnicodeDecodeError: ‘ascii’ codec can’t decode byte …
- 可能的原因:在decode的时候,没有使用对应字符串正确的编码格式来decode。因为python2中默认编码格式为ascii,所以这种情况一般出现在python2中。
- 出现错误的情形:在下面的例子中,
s.encode('gbk')
等同于s.decode(defaultencoding).encode('gbk')
,所以s.decode('ascii')
自然就会出错了。
s = '人生'
s.encode('gbk')
- 可行的解决方案:
1 明确原字符串的编码格式,有目标的使用decode
方法
2 文件头声明编码# -*- coding: utf-8 -*-
(如果s为unicode)
3 重载默认编码
reload(sys)
sys.setdefaultencoding('utf-8')
- 补充:文件头声明编码
# -*- coding: utf-8 -*-
的作用(目前两个)
1 代码中的中文均需要utf-8的文件头声明
3 初始化unicode对象时所用的编码格式,比如u'人生'
3. requests里面的编码问题
- 可能的原因:requests是我最常用到的爬虫http客户端包,能够非常好的模拟发送请求时的情形。在requests的返回值response中,有两个存放内容的属性,text和content,content比较好理解,返回的是字节码格式,但text不同,会根据一个encoding的属性来对字符串进行解码,这个encoding属性如果不去规范它,就会随意使用encoding来解码text,导致乱码。
- 可行的解决方案:在一开始我们就去规定好encoding这个属性的值,或者只用content字节码。
import requests
url="http://xxx.xxx.xxx"
response=requests.get(url)
response.encoding='gbk'
print(response.text)
4. BOM(u’\ufeff’)头导致的相等判定错误
当BOM头混在string和unicode里面的时候,会没办法打印出来看到,所以需要特别注意,当两个字符串没法相等,但是打印出来的结果一模一样的时候,打印unicode看看。