Python处理encoding的小技巧
用Python写过处理文本经常会遇到需要decoding或者encoding, 尤其是处理中文的时候。
encoding的问题处理起来是个脏活儿,报错不太容易看懂,网上相关资料不太好查。有同感?请继续读下去。
常规做法是读取文件的时候立刻decode, 所有的处理工作都用unicode,写会文件的时候encode. 但是等到读取的时候在处理的代码读/写起来都很别扭,感觉像穿上鞋以后袜子滑下来了…Python 3.1.1以上的版本解决了该问题。在Python 3.1.1中,打开文件可以加入encoding的参数:
file = open(filename, encoding='xxx')
啊,这样看起来终于舒坦了。 不同写如下的code了
file = open(filename)
for line in file:
decoded_line = line.decode('xxx')
do something else
提倡使用utf8
Python程序员的进化
以前本站发布过一篇《程序员的进化》,以一种幽默的代码展现方式调侃了程序。下面这篇是关于Python程序员的。以阶乘为例,很有意思。
目录
新手程序员
第一年的刚学完Pascal的新手
第一年的刚学完C语言的新手
第一年刚学完SICP的新手
第一年刚学完Python的新手
爱偷懒的程序员
更懒的 Python 程序员
Python 专家
Python 黑客
专家级程序员
英语系的专家级程序员
Web 设计者
Unix 程序员
Windows 程序员
公司里的程序员
新手程序员
def factorial(x):
if x == 0:
return 1
else:
return x * ...
Python也Spring了
没想到啊,Python也有Spring的框架了,看看SpringPython项目主页(http://springpython.webfactional.com/)。这个项目的Leader是这样说的:Spring Python是基于Java的Spring框架(Spring Framework)和Spring安全(Spring Security)的一个分支,它以Python语言为目标。Spring提供了许多有用的特征功能,同样地这些特征功能在Python下也应当有效。– Greg Turnquist
从这个项目的主页可以看到有下面这些Key features:
反转控制IoC
面向方面的编程(AOPAspect-oriented Programming)
数据库访问 (Data Access)
事务管理 (Transaction Management)
安全性 (Security)
远程分布式 (Remoting)
插件/命令行工具 (Plug-ins/command-line tool)  ...
某Python实现的尾部递归
mailper 在2009年4月26的文章里《Guido认为程序员大多数工作不需要递归》谈及递归不是编程的基础。并且在python中并没有实现尾部递归Tail Recurssion。
但是,今天我们却看见了某Python实现的尾部递归
:)
Python处理中文的时候的一些小技巧
相信第一次处理中文的朋友们可能都会对中文的encoding 和程序的报错很头疼。
如果你像我一样希望能够把事情尽快做好而不去深究,你可能会写一些异常处理的代码把 UnicodeEncodingError糊弄过去先,但当你开始怀疑有多少encoding出错的信息被你丢弃的时候,可能你会很惊奇。于是,你还是会想坐下来,(洗把脸)然后面对自己必须弄懂什么是utf-8,什么是 ‘gb2312’, 什么是 ‘gbk’ 和其中的猫腻。正如有时候猛撕小伤口上邦迪胶布的快感一样,有时候当你认真面对一些你平时一直回避的问题的时候(其实有时候需要的不是勇气), 你反而会觉得“不过如此”,并且能够一劳永逸的解决问题。
关于Python处理Unicode,我所能找到的最言简意赅的入门教程是:
Unicode In Python, Completely Demystified (揭秘Python Unicode)
简要罗列一下最重要最实用的点:
Solution
Decode early (尽早decode, 将文件中的内容转化成 unicode 再进行下一步处理)
Unicode eve ...
Python脚本如何对文件通配符匹配
有时候,我们可能会写一些轻量级的脚本去处理很多符合某种pattern的文件,例如“某目录下的 *logfile.csv” 但是,我们大多数脚本的参数都是 sys.argv, 如何解析 wildcard 匹配呢?
test.py
from glob import glob
...
if __name__ == "__main__":
file_names = glob(sys.argv[1])
for file_name in file_names:
do_something(file)
这样就可以像使用其他终端命令一样使用脚本test.py 进行wildcard匹配了
>> test.py ./*logfile.csv
Python中实现多属性排序
我们有一组记录:
list_records =
(
(department, name, salary),
(department, name, salary),
...
(department, name, salary)
)
然后我们想进行类似 MS – Excel 里的 “then sort by” 中的功能一样先基于department排序,然后再在部门内按照salary排序。
其他编程语言可能相对复杂,我这里写出一个用Python实现的最简方法(也许有比这个还短的,来挑战吧)
list_records.sort(
key = lambda l: (l[0], l[2])
)
这个就是函数是编程的好处,可以无中生有的构造出一个没有名字的inline函数。假设我们有另外一个dictionary_age 是保存的 { name: ages }, 我们还可以简单的实现基于外部属性进行排序。例如,如果我们想先按照部门排序,然后在部门里按照年龄排序,我们可以写:
list_record.sort(
key = lambda l:( l[0], dictionary_age ...