千锋教育-做有情怀、有良心、有品质的IT职业教育机构

位置:首页 > 行业动态

Python编码二三事

时间:2017-06-13 09:42:04  |  来源:千锋教育上海校区  |  作者:千锋  

  Python的职位与薪资 嘴上说不要身体很诚实!未来十年Python的前景会怎样?Python在国内的发展会怎样?使用Python的企业会不会越来越多?使用Python的程序猿会不会越来越多?千锋Python课程择选择择业内项目,解决方案覆盖面广,手把手指导,培养实战能力,轻松度过试用期!

Python.jpg

  在审计的时候比较喜欢注意对字符串操作的编码、解码和截这些操作,因为这里有可能导致对抗SQLi和XSS等安全函数失效。

  前两天改一个自己刚入学的时候写的python小工具,发现编码解码真是一个头疼却有不得不面对的问题。

  一个小工具如果是自己用,写的很粗犷能达到预期目的就行。但是如果给别人用甚至多人用,就不得不考虑代码的健壮了,不仅仅要预想运行的不同环境,也要考虑不符合预期的输入应该怎么处理。

  从文件或者数据库读取输入后,在对内容进行处理前(如正则匹配),要先对输入进行一次规范化。我发现这是我经常疏忽的问题,结果就是在我的机器上可以跑,而给别人用的时候总会出问题。

  一个数据交互不大的程序,可以考虑直接读写文件txt/csv/xls等,再大一点SQLite也不错。从文件读取的内容的编码和文件是一致的,这时候如果要取出来的字符串进行正则匹配或者去数据库匹配结果,编码就很重要了。

  可以考虑使用chardet模块先对字符串编码格式化,再进行其他处理。ab是从两种不同的文件中读取到的字符串,cd是程序中定义的字符串,下图可以看到chardect对他们的编码的识别。

  从c和d的编码的区别我们可以发现,变量的值如果是一般字符,变量的编码格式是ascii;变量的值如果是汉字或者其他特殊文字,将随py文件的编码而编码。

  大多数资料中提到这种情况会随文件也就是第二行声明的utf8而编码(事实上确实如果在头部不申明编码,这样进行赋值程序将会报错)。然而测试发现即使文件申明用gbk编码,值为汉字的变量的编码格式仍然是utf8,这可能和操作系统有关,没有继续研究这个点,因为既然识别出来了,可以用chardet.detect很方便的解出来。因此只要在操作字符串之前加上

  1data=data.decode(chardet.detect(data)[‘encoding’])这时候字符串被转换成ascii格式,这种格式可以使用encode函数转换成想要的编码就行了。

  多的时候我们会使用SQLite或者MySQL,比如做数据对比或者提取关键信息时,不编码肯定会出问题,MySQL数据存储的时候我一般设置成utf8-general-ci,所以设置数据库连接的时候使用一样的格式。

  1MySQLdb.connect(host=”,user=”,passwd=”,db=’test’,charset=”utf8”)这样设置一致读出来的数据直接处理一般没出什么问题,然而养成好习惯还是可以用chardet先格式化一次避免出现问题。

  剩下聊一些其他不符合预期的输入或者操作导致的问题的解决吧。

  使用try,然后pass掉出错的数据自然是一个很省力的方案。但常常不是优的方案,因为这样本来能够处理的数据因为上面的原因而被抛弃掉,如果舍弃数量大或者刚好舍弃掉重要的数据对功能产生很大影响。所以好还是要找到根源问题所在,上面的小程序改的心有些累,就是因为有时候有少量数据处理中会出错,不好被直接pass掉而不得不重新选取方法,导致了需要修改大片的代码~

  找到问题->查找资料->思考解决方案->解决问题这个链条中,我们常会比较在意的是找个和后一个环节,现在感觉中间的反复资料查找和思考却是难的。上文提到的程序修改的时候还遇到了很多各种各样的问题,git一些项目中的做法和stackoverflow上的讨论等等常能提供很多思路。

  具体做法还是见人见智,找到适合自己的方式就好。Leader Ourren常让我们在各方面要多自己思考,而不要去依赖别人给出的解决方案。事实上也切身感受到,如果在过程中自己多思考,后常会发现解决问题的方法上得到的收获远大于问题本身。

上一篇:学习PHP难么,应该如何系统学习?
下一篇:Linux运维工程师必学的8项IT技能

课程咨询

  • 北京天丰利校区(总部):北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术广场服务楼2层、南区服务楼2层
    咨询电话:400-654-7778 010-82790226/7-801
    面授课程:Android培训、HTML5培训、UI交互设计培训、PHP培训、JavaEE培训、大数据开发培
                     训、VR/AR混合现实培训、iOS培训、好程序员
  • 深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷A区B座605-619
    深圳大学城校区:深圳市南山区留仙大道1201号大学城创客小镇16栋2楼、3楼
    咨询电话:0755-33582485-801(硅谷校区)0755-86660670-801(大学城校区)
    面授课程:Android培训、HTML5培训、UI交互设计培训、PHP培训、JavaEE培训、iOS培训
  • 上海地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-627-7899 021-56166283/56166279
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、JavaEE培训、iOS课程培训、好程序员
  • 郑州地址:郑州市金水区纬五路21号河南教育综合楼(经纬中学楼)6/7/8层
    咨询电话:0371-55191750 400-654-7778
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、JavaEE培训、iOS课程培训
  • 广州地址:广州市天河区元岗路310号智汇park创意园E座5层
    咨询电话:020-22119207 400-654-7778
    面授课程:Android课程培训、HTML5课程培训、JavaEE培训、iOS课程培训
  • 大连地址:辽宁省大连市甘井子区软件园路2号东软信息B8座2层
    咨询电话:0411-39026086 400-654-7778
    面授课程:Android课程培训、HTML5课程培训、JavaEE培训、iOS课程培训
  • 武汉地址:武汉市江夏区藏龙岛杨桥湖大道15号拓创大厦15楼
    咨询电话:027-81772047
    面授课程:Android课程培训、HTML5课程培训、JavaEE培训、iOS课程培训
  • 成都地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、JavaEE培训、iOS课程培训
  • 校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85260160 029-85261030 029-85260960
    面授课程:Java课程培训、Android课程培训、HTML5课程培训、JavaEE培训
  • 杭州地址:浙江省杭州市江干区九堡旺田书画城A座4层
    咨询电话:0571-86893632 010-82790226-801
    面授课程:Android课程培训、HTML5课程培训、iOS课程培训
  • 青岛校区地址:青岛市市南区金坛路17号青岛职业技术南校区实训楼A4层
    咨询电话:0532-80910752/3 010-82790226-801
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、iOS课程培训
  • 了解千锋动态
    关注千锋教育服务号

  • 扫码关注千锋互联
    身边的移动开发导师