python中的文本处理1 草稿
章节1: python基础
这章讨论了python的一些在文本处理的时候经常会用到的特性。对于那些还未“python入门”的读者来说,<http://python.org/doc/current/tut/tut.html>是一个好的选择。然而这里并不想过多的设计这些,比起python语言本身,我们更着重在文本处理上。
在1.1部分,我会描述一些来自python自身的文本处理技术,但是显然这对于python刚刚入门的人来说并不适合。(有时候甚至对于中级的python使用者也是如此)在强调一遍我们着重在python文本处理的部分的一些编程技术,python里另外一些同样有趣但是和文本处理无关的特性将不会被讨论。
在1.2部分,我会讨论下python标准库里的一些模块,在你自己的文本处理应用中,你很可能也会用到它们(反之,python标准库里面的其他在文本处理中不会用到的模块也将不会被讨论,相关的讨论请见python标准库的文档)。
1.1 技术和模式
topic:使用higher-order函数
(不要害怕,你可能没有听过这个所谓的higher-order的函数,事实上对于一些有经验的python程序员,所谓的higher-order函数对他们也是不熟悉的,但是函数式编程你应该听说过吧,不熟悉没关系,反正后文没有他你也能看懂,本文的最后会详细的解释函数式编程和这个higher-order函数的)
在文本处理中,我们面对的其实就是一堆一堆同质的文字,通常他们都是通过换行符分割开来成为一行一行的形式。通常一些距离紧密的词语和语块意思上也更加紧密。python提供了标准的按行来读取文件内容的模块。另一个假设是:文本的每一行通常自然地包含一个信息块。
下面是一个读取文件内容,并选出符合条件‘isCond()’的那些行。
selected = [] # temp list to hold matches
fp = open(filename):
for line in fp.readlines(): # Py2.2 -> "for line in fp:"
if isCond(line): # (2.2 version reads lazily)
selected.append(line)
del line # Cleanup transient variable
好了,这段程序没有什么错,但是我总是觉得它变扭,程序要一遍又一遍的循环,通过条件判断,那个变量line被一遍又一遍的赋值,事实上我们其实并没有必要这么干,如果按照函数式编程的方法,下面的这段程序可能更好些:
selected = filter(isCond, open(filename).readlines())
没错,就这一句就完了,哈哈,怎么样够节俭吧,省得敲了多少代码。。。
再考虑的具体一些,假设文本处理的对象是一个log文件。(对,就是大家脑袋里想象出来的那个)几乎所有的程序都能产生log文件,例如造成系统崩溃的系统log,或者那些需要长期运行的,间歇性的产生log的数据库。在我们的例子中,pythonlabs 的windows安装版在安装的时候产生了install.log,它记录了在安装过程中所发生的。下面是一个例子:
#------------ INSTALL.LOG sample data file --------------#
Title: Python 2.2
Source: C:\DOWNLOAD\PYTHON-2.2.EXE | 02-23-2002 | 01:40:54 | 7074248
Made Dir: D:\Python22
File Copy: D:\Python22\UNWISE.EXE | 05-24-2001 | 12:59:30 | | ...
RegDB Key: Software\Microsoft\Windows\CurrentVersion\Uninstall\Py...
RegDB Val: Python 2.2
File Copy: D:\Python22\w9xpopen.exe | 12-21-2001 | 12:22:34 | | ...
Made Dir: D:\PYTHON22\DLLs
File Overwrite: C:\WINDOWS\SYSTEM\MSVCRT.DLL | | | | 295000 | 770c8856
RegDB Root: 2
RegDB Key: Software\Microsoft\Windows\CurrentVersion\App Paths\Py...
RegDB Val: D:\PYTHON22\Python.exe
Shell Link: C:\WINDOWS\Start Menu\Programs\Python 2.2\Uninstall Py...
Link Info: D:\Python22\UNWISE.EXE | D:\PYTHON22 | | 0 | 1 | 0 |
Shell Link: C:\WINDOWS\Start Menu\Programs\Python 2.2\Python ...
Link Info: D:\Python22\python.exe | D:\PYTHON22 | D:\PYTHON22\...
你看一看出每一条记录都是几种行为中的一种,一个处理程序可能会根据不用行为而做出不同的反应,使用布尔函数,甄别出记录所对应的行为类型是很容易的:
def isFileCopy(line):
return line[:10]=='File Copy:' # or line.startswith(...)
def isFileOverwrite(line):
return line[:15]=='File Overwrite:'
(未完待续)
优质内容筛选与推荐>>