文章目录
- 问题一:python 2.7版本解决TypeError: 'encoding' is an invalid keyword argument for this function。
- 问题二:python读取文件时提示"UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence"
- 情景一:
- 情景二:
- 问题三:python执行SQL报错:not enough arguments for format string
- 问题四:输出的信息为转义码
- 问题五:使用list的clear()方法时的注意点
- 问题六:Python下调用json.dumps中文显示问题解决办法
- 问题七:报错:pymysql.err.OperationalError: (1040, 'Too many connections')
- 问题八:ValueError: invalid literal for int() with base 10: “”
- 问题九:解决python中TypeError: not enough arguments for format string
- 问题十:消除python中控制台输出的警告信息
- 问题十一:报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
最近要频繁的玩Python,在这里总结下遇到的一些问题,持续更新中。
问题一:python 2.7版本解决TypeError: ‘encoding’ is an invalid keyword argument for this function。
用Python2.7来打开一些文件的时候,经常出现以上的所表示的问题,如
data_file = open("F:\\MyPro\\data.yaml", "r", encoding='utf-8')
运行的时候报错:TypeError: ‘encoding’ is an invalid keyword argument for this function。但在Py3中运行却不会遇到这样的问题。
解决办法:网上查找一番后,改成如下这样就可以搞定
import io
data_file = io.open("F:\\MyPro\\data.yaml", "r", encoding='utf-8')
至于原因根据报错的信息看也许跟Py2和Py3的API规定不同有关吧。
问题二:python读取文件时提示"UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 205: illegal multibyte sequence"
情景一:
同样是读取文件时,碰到的编码问题。
解决办法:
FILE_OBJECT= open('order.log','r', encoding='UTF-8')
只需要加入对应的encoding参数就OK了,对于Python中的编码问题,有时候也很麻烦。不过这类问题一般百度下就能找到对应的解决办法。
情景二:
突然在用pandas读取别人的.csv数据的时候出现了一种奇怪现象:用Python2的解释器时可以读取,用python3的解释器却无法读取。报上面的错误,后来在方法中添加encoding参数依旧不可行,之后查阅资料才知道,原来是.csv文件本事的格式问题,首先确保你的.csv是utf8编码(用notepad打开.csv文件查看文件编码格式),其次要确保你的.csv在保存的时候也是.csv utf-8格式(可以再重新打开.csv文件再保存为.csv utf-8格式),如下图所示:
问题三:python执行SQL报错:not enough arguments for format string
在Python中执行SQL的查询语句的时候爆出这样的错误,如
sql='select * from Teacher where Tname like \'%%'+ keyword +'%%\''
。后来才知道出现这类问题,主要是字符串中包含了%号,python 认为它是转移符,而实际我们需要的就是%, 这个时候,可以使用%%来表示%,也就是说sql字符串中的百分号全都要用%%来表示。
问题四:输出的信息为转义码
# ((u'01', u'\u5f20\u4e09'), (u'04', u'\u5f20\u4e09\u4e30')) # (u'01', u'\u5f20\u4e09')
这种情况也只有在Py2中才会出现,Py3中是不会出现的。
解决办法:将输出的转义码通过以下的eval方法转化为对应的中文。
print(eval("u"+"\'"+exmple[1]+"\'"))
问题五:使用list的clear()方法时的注意点
最近在写一段如下代码时:
for line in lines:# print(line)for x in jieba.lcut(line):# print(x)if x not in stopwords:text1.append(x)text2=text1corpora_documents.append(text2)# print(corpora_documents)text1.clear()
这里由于类型转化问题不能采用简便的方法来直接分词并剔除停词,所以只能用这种方式来实现相同的功能,但是在实现的过程中,原本期望返回的corpora_documents是下图所示的效果:
但是却得到了一组空的List。这让博主很是郁闷(毕竟博主之前是写Java的,面相对象的思想“根深蒂固”,以为声明出来一个新的text2对象,就会开辟一块新的内存空间来存储text2的内容,这样text1和text2也就是值传递了而非引用传递,可是这是java的内存加载机制。。。),不过后来随着博主无意间将最后一行代码改为:
text1=[]
得到了自己想要的结果,之后再分析原因的时候,发现博主没有切换到Python的内存管理机制。其实整个过程对于Python来说内存管理如下:
for line in lines:# print(line)for x in jieba.lcut(line):# print(x)if x not in stopwords:text1.append(x)text2=text1#相当于将声明的两个对象的指针指向同一块内存空间即text1所在的内存空间corpora_documents.append(text2)#Python采用的应该是延迟加载,也就是说这里corpora_documents只是将指针指向了text2的内存地址,并没有直接就将text2里面的内容加载进来。# print(corpora_documents)text1.clear()#clear()就相当于擦除了text1中的内容,即text2指向了一个空的内容,由于Python延迟加载的特性也就造成了后面打印出来的corpora_documents的内容为空print(corpora_documents)
所以在使用clear()的时候一定要注意对象之间的关系,一不留神就会造成很大的损失。感觉这个问题好像在那本书中有提到,还得复习下基础知识,很多问题只有不断的Coding才能碰到,还是实践太少,仍需继续努力。
问题六:Python下调用json.dumps中文显示问题解决办法
最近在开发某个功能的时候,需要将前台的信息返回到后天处理后,以json字符串的形式返回,但是返回的内容显示在网页中确实ASCII码值,下面是这个问题的解决办法:
配置下dumps方法中的ensure_ascii这个属性!
data={"url":"http:www.dianwe.com","content":"采集Test","CreateTime":"2014-07-08 23:29"}
bizResult= json.dumps(data, ensure_ascii=False)
print(bizResult)
这样便不会转为Ascii 编号了!
问题七:报错:pymysql.err.OperationalError: (1040, ‘Too many connections’)
mysql数据库 Too many connections
出现这种错误明显就是 mysql_connect 之后忘记 mysql_close;我的情况是实现了自动更新本地数据库在测试的时候每次更新后又忘记关闭对应的connect,当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个。只需在代码中添加对应的connect.close()方法即可。
问题八:ValueError: invalid literal for int() with base 10: “”
最近在写代码的时候,突然爆出这样错误,根据字面意思是类型转化的问题,但是仔细检查了代码,发现类型转化没有问题。无奈只能去求助度娘,很多博客也说是类型转换的问题。以下是某博客的一个实验:
>>> int('')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
>>>>>> int("x")
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'x'
从中可以看出这类错误就是字符无法转换为int型。但是仍找不到对应的错误的位置在哪里,刚好看看到一个建议:“为了避免类似错误,以后进行int类型转换时,注意检查,或者直接加try 捕获下”
# try:# print(int(re.sub("\D", "", x)))# except ValueError:# print("-"*40)# print("异常值"+x)
一查竟让多出了一些nan值:
但是后来去和数据做比对的时候,实在是也没有发现有什么nan值,这就很奇怪了,所以为了能让程序跑下去,这里就先省去了这个int的强制变换。
问题九:解决python中TypeError: not enough arguments for format string
出现这类问题,主要是字符串中包含了%号,python 认为它是转移符,而实际我们需要的就是%, 这个时候,可以使用%%来表示
问题十:消除python中控制台输出的警告信息
程序运行中经常会碰到python控制台显示警告提示SettingWithCopyWarning的信息,一般来说没什么大事,但是当这些信息多了之后就会干扰你查看一些关键信息的效率,那么如何让控制台不提示这类告警呢?很简单只需在代码中添加以下两行代码即可:
import warnings
warnings.filterwarnings("ignore")
问题十一:报错:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 0: ordinal not in range(128)
使用python2.x的时候,即使在代码头部声明了encoding=“utf-8”,但是程序执行的时候仍会报这个错误,这时候只需要在头部添加如下代码即可
import sys
reload(sys)
sys.setdefaultencoding('utf8')
ps:python3.x一般就不会出现这种情况!