- 浏览: 229474 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
在公司里,由于整个开发流程相对规范,整天都是拿着文档做开发,动脑筋也不太多了,久而久之难免会感到厌烦,还好有一些不需要循规蹈矩的小task可以调和一下。事实上,对于这些小task,Leader通常都会很头痛,因为都是一些如果手工完成都会让人抓狂的,繁琐而无聊的工作。每每接到这些看似很无聊的task,我都会考虑用较为聪明的方式将其完成。虽然俺的劳动力低廉,但是也不想被这些无聊的工作坏了心情,也正好可以动动自己那快要生锈的脑筋。
这次来的task有点棘手:在3万多行的文本中找出符合要求的文本段。这些文本段当中,可能有一部分是相同的,所以还要统计相同文本段出现的次数,最后以一个统一的格式输出到一个文件中。既然是文本的处理,最自然就是想到了处理文本的利器:Python。好,明确了task,也选好了工具,开工!
首先我大致看了一下整个文本的组成,发现文本无非是由两种类似的文本段组成的:包含字符串"Servelet.Engine.Transports"的文本以及包含"Thread"的文本。而task的要求则是从中挖出包含"Servelet.Engine.Transports"的文本段,并且在此基础上统计相同文本段出现的次数。既然如此,就不要一步到位了,来个步步为营吧——先将包含"Thread"的文本段给过滤掉,得到只包含"Servelet.Engine.Transports"的文本,最后再做统计。那么,问题就细化为如何过滤文本了。于是,我翻阅了一下文档之后,写出了以下的代码:
log = open("20060323.txt", "r")
output = open("servlet.txt", "w")
num = 0
for line in log.readlines():
if re.search("Servlet.Engine.Transports", line):
num = 1
output.write(line)
elif line == "\n" and num == 1 :
output.write(line)
num = 0
log.close()
output.close()
真的很简短喔!嘿嘿,注意啦!我可不是在自卖自夸哦,偶是在夸着Python提供了很不错的API,让我可以用很简单的方式完成了所需的工作。对于以上代码,需要注意的地方是re这个module以及module中search函数,还有关于文件的简单操作。由于open函数存在于__builtins__中,因此不需要import任何的module就可以直接使用了,而open函数返回的正是一个file类型的对象。对于open函数来说,第一个参数是文件名,而第二个参数则是操作文件的方式,"r"代表读操作,而"w"则代表写操作。如果没有指明具体的文件操作方式,那么默认就是读操作了。在获得文件对象log之后,通过readlines方法就可以获得整个文件所有行的文本内容,并且存放于一个list中,便于进行遍历。进入到for...in循环体,我们可以见到一个特别的module——re。re是一个用于正则表达式的module,search函数的第一个函数表示正则表达式的pattern,而第二个参数则是用于校验匹配的字符串。一旦该字符串符合第一个参数给出的pattern,那么将返回一个MatchObject对象,否则就返回None,所以这样一个方法就能够帮助我找出符合条件的字符串了。不过,再仔细想一下,我只不过是要找出包含某个固定子串的字符串而已,出动正则表达式真的有杀鸡用牛刀的感觉了。于是,我将if后面的条件判断换成了string.find(line, "Servlet.Engine.Transports") > 0,并且引入string这个module。这下子总算心里舒坦了,一个萝卜一个坑,简单的string操作还是用string module比较爽。当然了,速度上也有了提高。好,第一步大功告成,接下来就是对相同文本段进行统计了。
既然是统计,第一步就要知道在所有的文本段中有多少个是完全不同的,这样先得到一个不包含重复元素的列表。然后再根据这个列表重新遍历所有的文本段,得到统计结果。这样一分析,问题又细化为如何得到一个不包含重复元素得列表中了(需要说明的一点,对于第一步输出的文件,我以List嵌套的方式表示之:[[txtline1,txtline2, txtline3], [txtline5, txtline6], ...])。我一开始想到了set这个数据类型,因为它就是用于表示一个不包含重复元素的数据列表,同时也提供了将list转化为set的方法。例如(以下引自Python Tutorial):
>>> fruits = set(basket) # create a set without duplicates
>>> fruits
set(['orange', 'pear', 'apple', 'banana'])
于是,我将set(iterable)这个函数应用到自己构造的List中,却遇到了这样的错误:TypeError: list objects are unhashable。原来set(iterable)这个函数并不能应用在List的元素也是List的情况下。就这样,第一个想法被否定了,偶那生锈的脑袋也短路了,一时间无从下手。后来我想,既然是对List的操作,还是从List入手吧,于是我开始翻阅有关List的函数。很快的,我发现了List有一个count函数,用来统计List中某个元素出现的次数的。这让我欣喜若狂,因为solution已经找到了,原来就是这么简单:
for sortedItemList in sortedList: # sortedList就是包含了所有文本段的List
if tmpList.count(sortedItemList) == 0:
tmpList.append(sortedItemList)
最后得到的tmpList就是一个不包含重复文本段的List了。有了这样一个所有元素都是唯一的List,最后的统计也很好办了。这不是还有刚刚帮了大忙的count函数吗?
for tmpItemList in tmpList:
for tmpItem in tmpItemList:
unique.write(tmpItem)
countno = sortedList.count(tmpItemList)
好了,大功告成!一个繁琐的task在Python的帮助下,变得简单而有趣,而我也不由得被注重实效的Python再次深深打动了。可是,每一次都被打动,而每一次都因为这样那样的借口把她晾在了一边,直到有了棘手的task才想起她,真的很糟糕。要做一名pragmatic programmer,光说不练可不行啊!OK,思过完毕,我们下次再接着聊Python,哈哈!
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1273重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1159对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1057在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1341所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1236在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1214在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1315在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1158昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1059昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1538由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1248今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1042为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1137昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 928使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1042这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1009今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 983在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1530昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1588很久没有用 ... -
两天四疑问
2004-09-03 10:56 10049月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
Straight from the programming trenches, The Pragmatic Programmer cuts through the increasing specialization and technicalities of modern software development to examine the core process--taking a ...
The Pragmatic Programmer 是我转的 txt的
《The Pragmatic Programmer》(《实用程序员》)是一本由Andrew Hunt和David Thomas所著的经典软件开发书籍。书中不仅深入探讨了软件开发的最佳实践,还着重讲解了如何成为一名更加高效、有责任感的程序员。本书...
《The Pragmatic Programmer》是IT领域中一本极具影响力的经典著作,由Andy Hunt和Dave Thomas合著。这本书旨在提供实用的编程建议和策略,帮助程序员提升技能,优化工作流程,并成为一个更高效的开发者。通过深入...
《程序员修炼之道——从码农到大师》(The Pragmatic Programmer)是一本深受程序员喜爱的经典书籍,由Andrew Hunt和David Thomas合著。这本书旨在帮助程序员提升技能,提高工作效率,成为一个更加“务实”的开发者...
《Programming Ruby - The Pragmatic Programmer's Guide》第二版(2005年注释版)是一本在IT行业中享有盛誉的经典书籍,专门针对Ruby编程语言进行了深入浅出的讲解。该书不仅覆盖了Ruby语言的基础知识,还探讨了其...
The Pragmatic Programmer; From Journeyman to Master - Pearson Education.pdf
- **The Pragmatic Programmer, From Journeyman To Master**:此书名暗示了本书旨在帮助软件开发人员从初级阶段(学徒,journeyman)成长为高级专家(大师)。这里的“实用程序员”指的是那些能够运用实践经验和...
Each developer is unique, with individual strengths and weaknesses, preferences and dislikes.... However, if you're a Pragmatic Programmer, you'll share many of the following characteristics:
《Programming Ruby: A Pragmatic Programmer's Guide》(俗称“Pickaxe”书,因其封面上的镐头图标而得名)是一本关于Ruby编程语言的经典著作。这本书由David Thomas、Andrew Hunt和Dave Thomas共同编写,被认为是...
- **入口点**:每个GWT应用都有一个主类作为入口点,该类需要实现`EntryPoint`接口。 - **事件处理**:GWT提供了一套完整的事件模型,支持各种类型的用户交互事件,如点击、拖拽等。 - **小部件**:小部件是构成GWT...
This book covers construction, exploration, analysis, and visualization of complex networks using NetworkX (a Python library), as well as several other Python modules, and Gephi, an interactive ...
《Ruby编程,实用程序员指南》是一本针对Ruby语言的学习教程与参考手册,旨在为程序员提供一个全面、深入的Ruby语言学习资源。本书不仅适合初学者快速入门,也适合具有一定经验的开发者进阶学习。 ### 一、Ruby语言...
《程序员的思维修炼》(Pragmatic Thinking and Learning)由Andy Hunt撰写,是一部旨在帮助程序员提升思维能力、学习效率和工作效能的专业书籍。本书聚焦于如何优化个人的“湿件”——即大脑,通过一系列实用的方法...