python中的编码
2010-06-02在一些python讨论版里,经常会见到一些“月经帖”,类似于“我用python读取一个文件乱码”,然后就会抱怨python的编码很麻烦,其实不是python编码难搞定,而是没有真正理解python的编码。
如在windows环境下的以下示例代码:
#!/usr/bin/env python
import sys
import os
def do():
f = open('./ansi.txt')
for a in [x.strip() for x in f]:
print a
if __name__=='__main__':
do()
此时的ansi.txt编码为ansi,我们在cmd窗口执行,看到如下结果:
此时一切正常,但,如果还是用上面的脚本去读取utf8.txt,文件是utf8编码,就会得到下面的结果:
经典的“乱码”出现了,有朋友可能会说了,我在python脚本里指定编码应该就解决了,于是:
#!/usr/bin/env python
#coding=utf-8 #在这里指定编码
import sys
import os
def do():
f = open('./utf8.txt')
for a in [x.strip() for x in f]:
print a
if __name__=='__main__':
do()
再次运行:
OMG,还是乱码。。。。
能不能正常输出中文不取决于#coding=utf-8,也不取决于目标文件的编码,而是取决于你的终端输出设备,这里就是CMD窗口,CMD窗口是不支持UTF-8的,它只支持GBK,所以,我们要转码。
那为什么第一个示例中,它能正确输出?因为目标文件本身就是GBK编码,所以不需要做任何转码就能正常输出。
在第二个示例中,我们只需要做一个小的改动,就可输出UTF8编码的文件:
#!/usr/bin/env python
#coding=utf-8
import sys
import os
def do():
f = open('./utf8.txt')
for a in [x.strip() for x in f]:
print a.decode('UTF-8').encode('GBK') #在这里转码
if __name__=='__main__':
do()
结果:
正常输出。
做一个小结:
- python脚本中的#coding=utf-8并不是决定最终输出的编码,而是指定python脚本本身使用的编码;如果你的脚本本身内部有非ASCII码,那就应该指定编码#coding=gbk
- 如果文件的编码是GBK,你操作的终端也是支持GBK的,那就不需要编码,直接输出即可。
- 如果文件的编码不是GBK,但你的操作终端只支持GBK,不支持UTF-8,那么,你就需要对这些字符做转码操作。如文件编码是UTF-8,就需要先decode成UNICODE编码再encode成GBK
Discuz发帖机Python版
2010-03-19流程:
1、获取logging.php?action=login页的源代码,分析得到fromhash
2、输入用户名与密码,POST至/logging.php?action=login&loginsubmit=yes地址
3、得到cookie并保存
4、访问发帖页面并附带上cookie
google appengine中的url routing
2010-03-04
在做rss4py的过程中发现这样的一个问题 ,直到现在也没有找到良好的解决方案。
def main():
webapp.template.register_template_library('filter')
application = webapp.WSGIApplication(
[
(r'/member/(?P<site>[0-9]+)/?', Main),
(r'/member/(?P<site>[0-9]+)/page/(?P<page>[0-9]+)/?', Main),
(r'/page/(?P<page>[0-9]*)/?', Main),
('.*',Error404),
], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
在这里,有三种符合匹配条件的url被交给Main controller去处理,即:
- /member/1 成员ID为1的记录
- /member/1/page/2 成员ID为1的第2页记录
- /page/1 所有成页的第1页记录
Main Controller:
class Main():
def get(self,site = 0,page=1):
self.write('site : %s' % site)
self.write('<br />page: %s' % page)
return
当访问/member/1/时,输出:site:1 page:1
访问/member/1/page/2/ 时,输出: site:1 page:2
访问/page/3 时,输出:site:3 page:1
可以看出,前面二个URL的区配都是正确的,但第3个是错误的,需要的输出是:site:0 page:3,很明显,3被当成参数site被传递了,
如果单纯交换Main/get方法中site/page参数的顺序的话,第三个URL匹配正确,第一、二个就不正确了。
方案1:将URL规则做如下修改:
def main():
webapp.template.register_template_library('filter')
application = webapp.WSGIApplication(
[
(r'/(?P<site>member/[0-9]+)/?', Main),
(r'/(?P<site>member/[0-9]+)/(?P<page>page/[0-9]+)/?', Main),
(r'/(?P<page>page/[0-9]*)/?', Main),
], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
修改后的URL规则中将member/page都做为参数传递到Main的get方法中,即访问/member/1/page/5时,get方法中的site参数值为member/1,page参数值为page/5,这样轻易分析一下就能得到正确的site/page值。
方案2:一个URL规则搞定:
(?:/member/(?P<site>[0-9]+))?(?:/page/?(?P<page>[0-9]+))?/?
这个正则太狠了
臭蛋聚测试版发布
2010-02-25臭蛋聚是一个RSS聚合器,构建在Google App Engine上的,写的这个小应用是用来取代原有的feed.yibin001.com(和谐了)。
有段时间没写gae的小应用了,刚开始时还显得有点陌生,在此期间也遇到一些小问题,在这里一并写出来,希望对初次开发gae应用的朋友有一个帮助。
- gae datastore,在gae中,所有Gql的排序字段都是需要建索引的,否则会出现经典的”NeedIndexError: no matching index found.”错误,附在错误后面的信息就是需要建立的索引,你可以复制下来,然后粘帖到index.yaml文件,并上传。上传后并不能马上使用,gae需要一个build的过程,这个时间长短要看数据量的大小,索引状态变成Serving时就意味着索引已创建成功。
- Gql查询结果排序问题。排序的字段要有值,不能为None,否则结果集可能不是你所需要的。如:SELECT * FROM Feeds ORDER BY LastPubDate DESC,如果此时的LastPubDate都没有值,即使有10条数据,这条查询无法返回记录的。
- 对于GMT(rfc822)时间格式的解析。按rss标准,PubDate正确格式应该是Sat, 20 Feb 2010 07:04:52 +0000,直接用datetime模块解析不是很方便,可以用rfc822模块中的parsedate_tz函数进行转换。对于非标准GMT(rfc822)格式的时间,只能配合正则进行解析。
最后,臭蛋聚的地址为:http://rss4py.appspot.com/
百度图片抓取工具
2009-11-01有时我们需要从baidu上找一些图片,比如某一个美女或某一个帅哥,一张一张下载太麻烦,于是产生了下面这个工具
运行截图:
开心网省份、城市、学校数据库版
2009-10-30
目前支持SqLite及MySql数据库,运行时会有选择数据库的选项
如果是MySql数据库,请确保目标库已建立,请确保登录用户有建立数据表的权限。
如果是SqLite数据库,库文件会自动在该文件所在的目录下生成,库名为kaixin001.db3
获取开心网的省份、城市及学校列表
2009-10-28目前在做公司的一个SNS项目,其中有一个模块就是添加教育经历,整个流程与开心网基本一致。
开心网中的城市列表及学校列表返回格式是json的,c#中不大好处理json,不能“智能”地将json字符串转换为一个“对象”。
php处理json异常简单,直接用json_decode就行了。
这里是用python实现的,用到了第三方的一个json模块,调用后直接将json转成了list
运行时效果如下:
天气预报查询器-python版
2009-10-09看了几天的python,写了个天气预报查询器玩玩
数据取自http://php.weather.sina.com.cn/
运行效果:







