python报错问题
1、Python中’Nonetype’ object is not iterable的问题
None 值被赋给了多个变量,如下
a, b = None
该对象的值为None,可能被赋值的时候出现问题(源数据为None)
*当一个函数没有return语句,函数会返回None,此时如果将函数返回值赋给多个变量,则容易出现上述错误。
2、TypeError: can’t compare datetime.date to NoneType
3、Warning: Data truncated for column ‘end_collect_time’ at row 1
end_collect_time值类型与数据库中的值的类型不匹配
4、(1064, “You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘)’ at line 1”)
sql 语法错误,sql中某个条件为空了
例如:where id in ()
5、(1054, “Unknown column ‘None’ in ‘field list’”)
往数据库中插入数据的时候,某些数据为Nonde
6、函数在没有返回值时 默认返回None
7、Warning: Data truncated for column ‘end_collect_time’ at row 1
cursor_test.execute(sql_insert)
由于插入的数据格式与数据库中的数据格式不匹配造成的
8、ascii’ codec can’t encode characters in position 14-15: ordinal not in range(128)
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe9 in position 0: ordinal not in range(128)
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-5: ordinal not in range(128)”
python2.7 编码问题
python没办法处理非ascii编码的,此时需要自己设置将python的默认编码,一般设置为utf8的编码格式
解决办法:添加
#!/usr/bin/python
# -*- coding:UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
9、Python中Json.loads 报错 Expecting , delimiter: line 1 column 2640 (char 2639)
说明json 格式有误
10、ValueError: Invalid control character at: line 1 column 8363 (char 8362)
使用json.loads(json_data)时,出现:
出现错误的原因是字符串中包含了回车符(\r)或者换行符(\n)
(1)对这些字符转义:
json_data = json_data.replace(‘\r’, ‘\r’).replace(‘\n’, ‘\n’)
(2)使用关键字strict:
json.loads(json_data, strict=False)
strict默认是True,它将严格控制内部字符串,将其设置为False,便可以允许你\n \r
11、#将Unicode转换成普通的Python字符串:”编码(encode)”
unicodestring = u”Hello world”
utf8string = unicodestring.encode(“utf-8”)
asciistring = unicodestring.encode(“ascii”)
isostring = unicodestring.encode(“ISO-8859-1”)
utf16string = unicodestring.encode(“utf-16”)
#将普通的Python字符串转换成Unicode: "解码(decode)"
plainstring1 = unicode(utf8string, "utf-8")
plainstring2 = unicode(asciistring, "ascii")
plainstring3 = unicode(isostring, "ISO-8859-1")
plainstring4 = unicode(utf16string, "utf-16")
assert plainstring1==plainstring2==plainstring3==plainstring4
12、unexpected indent
意想不到的缩进,可能是tab和空格的问题
13、 数据库多表联查的时候 容易报错误
“1248, ‘Every derived table must have its own alias”
将后面的结果 设置一个新的表名 即可
产生错误的MySQL语句:
select count(*) from (select * from table group by sid);
正确运行的MySQL语句:
select count(*) from (select * from table group by sid) as t1;
就是把通过子查询出来的结果定义一个别名,我这里使用as定义成t1就一切正常了
14、
编码格式:unicode:实现方式:utf-8(常用),utf-16,utf-32
UTF-8 是 Unicode 的实现方式之一 ,它可以用来表示Unicode标准中的任何字符,
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对 Windows 简体中文版)
ASCII编码:字符集数量:128
GB2312编码:解决汉字编码问题,组合出大约7000多个简体汉字
GB18030编码:与UTF-8相同,采用多字节编码,编码空间庞大,最多可定义161万个字符
同样的存储,用不同的编码方案来解码,得到的结果不同
对于同样的字符,不同的字符集有不同的编码、
Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案
以容纳100多万个符号。每个符号的编码都不一样
1. 当取回来的数据与你当前脚本中声明的编码不一致时就要做编码转换
2.在编码转换时首先要将该数据以自身编码的格式换成unicode码,再将这个unicode按utf8编码
3.为什么我的浏览器会传回gb2312的编码数据到服务器,这应该和客户端的系统编码有关系
Python2中
#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文' # 注意这里的 str 是 str 类型的,而不是 unicode
s.encode('gb18030')
将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为 s 本身就是 str 类型的,因此
Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb18030。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是
ANSCII,如果 s 不是这个类型就会出错。
如果我们调用str.encode(),这里涉及到一个隐士的类型转化,会现将str转化成unicode,才能进行编码,
这也是不太容易理解的地方。
所以,str.encode()实际上就等价于str.decode(sys.defaultencoding).encode().
而sys.defaultencoding一般是ascii,它是不能用来编码中文字符的。
str.encode()实际上就等价于str.decode(sys.defaultencoding).encode().而sys.defaultencoding一般是ascii,它是不能用来编码中文字符的。
任何两种字符编码之间如果想完成转化,必须要通过unicode这个桥梁,先把它抓化成unicode对象;unicode对象直接进行输出,往往会出现乱码,需要解码成str对象
3、python 编码问题:
python解释器默认编码系统是utf-8格式的
windows系统默认编码系统gbk格式
例:s1 = "中国"
s2 = readfile(中国)//文件中读取
所以 s1 与 s2 比较就会错误
因为他们的编码格式不同,导致编码的最终结果不同
所以要进行编码格式的统一,然后在进行比较
if s1 == s2.decode('gbk').encode('utf-8'):
将gbk的文件读取然后对该字符串进行gbk解码然后转换成utf-8格式的
注:读取文件内容时,一定注意文件编码格式
sys.setdefaultencoding('utf-8')
https://www.cnblogs.com/WillZhang7/archive/2015/01/30/4262833.html
解决mysql中表字符集gbk,列字符集Latin1,python查询乱码问题:
最近在公司碰到一个异常蛋疼的情况,mysql数据库中,数据库和表的字符集都是’gbk’,但是列的字符集却是’latin1’,于是蛋疼的事情出现了。
无论我连接字符串的`charset`设置为`gbk`,`utf8`,`latin1`中的任意一种,查询出来的表中数据的中文都是乱码,在查询中加上如下代码也还是无济于事:
SET NAMES latin1
在更换各种py链接库,然后疯狂的google和问了各路大神之后,终于找到解决思路如下:
1、通过hex(column)将列中的数据2进制转为16进制字符串表示,然后返回给py
2、py通过2次decode操作,将hex字符串转为Unicode编码
3、最后进行一次encode,将结果转为utf8响应出去
伪代码如下:
def hex2char(hexString):
output = hexString.decode('hex').decode('gbk').encode('utf8')
return output
sqlStr = "SELECT acc_name,level_n,hex(char_name) FROM roles where acc_name='noc20'"
cur.execute(sqlStr)
for c in cur:
char_name = hex2char(c[2])
最后分析一下为什么之前,设置charset='gbk',然后对查询结果直接decode('gbk')无法操作的原因,
因为数据库字符集和表的字符集都是`gbk`,所以数据库链接我们这里必须设定为`gbk`,
但是由于我们需要获取的列名字符集被坑爹的设置成`latin1`,所以查询返回的字符串其实就是以`latin1`编码的,
实质上是`gbk`的字符串,当然使用任意一种decode都是无法正确转换的,只有将字符串转为2进制表示,才能无损的从数据库读出数据,
而`hex`操作正巧帮我们无损的从数据库将数据读出,然后就顺利成章的进行2次decode,
最后获得我们需要的字符串,最后再次谴责哪个坑爹设计了这样的数据库。
如果扔出错,建议换成范围更大的gb18030解码:
hexString.decode('hex').decode('gb18030').encode('utf8')
if False == 0:
print(“False == 0”)
结果为真,相等的
python2.7 读取文件编码格式
import chardet
f = open(‘a.doc’,r)
data = f.read()
print chardet.detect(data)
结果
{'confidence': 0.64465744, 'encoding': 'utf-8'}
前面是相似度 后面是编码格式
当编码格式解码编码正确时候,往数据库中插入数据后,仍然显示乱码
数据库连接的时候一定要设置对应的表的charset字符集格式
MySQLdb.connect(user=’root’, db=’zb_apps’, passwd=’tliving’, host=’10.171.15.38’,port=3306,charset=’utf8’)
charset:数据库编码.
python 方法
os.system(“python ./1.py”)
os.system(“python ./2.py”)
os.system(“python ./4.py”)
推荐阅读
-
Java基于代理模式解决红酒经销问题详解
-
jdbc连接sql server数据库问题分析
-
MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)问题的解决
-
MySql .frm数据库文件导入的问题
-
Java使用责任链模式处理学生请假问题详解
-
自动清理 MSSQL Server Table Collation问题的解决方法
-
关于Android SDCard存储的问题
-
spring cloud feign不支持@RequestBody+ RequestMethod.GET报错的解决方法
-
详解spring cloud Feign使用中遇到的问题总结
-
彭城码有什么用 徐州彭城码常见问题解答汇总