Python 好好用

python logo

要帮小鼠统计两个文本,看其中一个里面的每个汉字,在另外一个文件中都出现了多少次。任务很简单,但显然 shell 脚本难以胜任,文本中除了汉字,还夹杂着一些空格、半角标点和数字,拿 awk 之类的会累死人。用 C 自然也是用牛刀杀鸡,这场合 Python 最合适。去年早些时候学过一阵子,多少还记得一些,于是一边看指南一边动手。

代码写起来是相当容易,无非是读第一个文件每次取一个汉字,然后在第二个文本里搜,匹配到一个就计一下,搜完一个就 print 出来。文本若存成普通 latin-1 编码的,一个汉字就是两个字节,每次看一个字节,ASCII 值小于 128 的就认为是半角字符,跳过。一开始是在 Linux 上弄,因为有现成的 python 环境,后来发现 locale 是 UTF-8,文件编码总也搞不对,对这个不在行,就在 windows 上装了个 python,把文本文件存成 ANSI 编码就正确了。查了几下文档,调试了几次,寥寥二三十行就搞定了,还能判断重复的字。

很久没关注,Python 的 Logo 已经改成了看上去比较温和的两条蛇了,以前可是条大蟒的。这个有着众多好评的优秀语言,绝对值得掌握。仅仅是写这个小东西,我就体会到:

  • 读文件,比 shell 稍微罗嗦一点,但比 C 不知道容易多少倍,这种脚本更无需考虑关闭文件什么的,一条 buf = open('filename', 'r').read() 就搞定
  • 用 buf[i:i+2] 来取一个汉字,第一次接触 python 的时候就觉得这个切片操作太方便了
  • 用字典来存结果,res = {} 初始化,res[hz] = count 就可以建一个映射,好处是以后用 if hz in res.keys() 就可以判断有没有重复的字了。列表、元组、字典这些东西真是好

如果有人坚持说不习惯 Python 靠缩进来定界一个语句块的话,可以给那位手指贱的推荐下面这个写法(来自 Python Humor),哈哈

	if x: #{
foo
bar
#}
顺便说一句,千万别学 Perl。我所见到过的嘲笑 Perl 可读性之差的最好笑的一段是:“怎样获得一个随机的字符串?答案是从 perl 文件中随便读一段” :D 。

2 Comments so far

  1. jrm, on Feb 23, 2007 at 5:12am, said:

    请教您下面这个问题应该如何用python编程实现?
    现在要从一篇如下的文章中检索出所有的汉语词组,然后将这些词组分别存放到数据库中,并统计出所有词组的使用频次。

    副总统 切尼,大法官 先生、卡特 总统、布什 总统、克林顿 总统、尊敬的 教士、贵宾 们、同胞 们:
    今天,根据 法律的 规定,我们 举行 这个 仪式 向 宪法的 智慧 表示 敬意,同时 回忆 使 我们 国家 团结 的 深深的 承诺。我 为 此刻的 荣誉 而 感激。我 深知 我们 处在 一个 重要的 时代,决心 履行 我 在你们面前 所立 的 誓言。
    这 是 我们第二次 聚会。我们 的任务 并非 由 我们 的 言语 来 确定,而是 由 我们 共同 见证 的 历史 所 确定。冷战 结束 后,我们 经历 了 相对 平静 的 岁月,这 是 休憩 和 休假 的 岁月。而 在 这 之后 的 一天,突然 大火 从天 而降。

  2. mattw, on Feb 25, 2007 at 4:10am, said:

    如何取汉字、如何切词撇开不说,可用字典来存储词组出现的次数,好处是不用自己检索。用词组作为键,次数作为值,如 data['总统'] = 1

Leave a Comment?


« 准备出下策了  —  回来了 »

Tags

Blogroll

Fairy World | STUPiD | 阅微草堂 | ShelleX | 流浪五天