python学习笔记(五)文件操作、正则表达式

来源:互联网 发布:io域名广东备案 编辑:程序博客网 时间:2024/06/05 02:28

文件操作

python的文件IO操作和C++类似,都是流的形式。

fin = open('code.txt','r')fout = open('output.txt','w')

在c++中,每次打开文件后都需要判断打开是否成功,否则一旦读取出错程序就会终止,此外,读写操作完之后还需要调用close关闭文件。在python中也不例外,但是有比较方便的with语句来帮助完成这些操作:

with open('code.txt')as fin:    print fin.read()

在python中读写文件都是一次性的(至少在语句上是这样),如上read()语句将直接读出code中的所有内容。

with open('output.txt')as fout:    fout.write(data)

读文件时有时会遇到编码的问题,python使用的是unicode编码。通常对读出的内容使用decode(类型)来转换。
此外还有更简洁的方式,使用codecs库:

import codecswith codecs.open('code.txt','r','gbk')as fin:    fin.read()

正则表达式

正则表达式是专用于操作字符串的工具。关于正则表达式需要不断使用、查书、使用才能学会。
这里用之前的NC代码编译器作为例子,来探索python中的正则表达式使用方法。

模式

模式表达了需要的字符串的。
模式表达方法:

pattern_str = r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;'

在模式中,()括起来的内容属于一组,每当匹配一个,组就增加一个。

匹配

匹配一个字符串,有两种方式,一是使用re模块中提供的方法进行匹配,二是建立一个模式对象,使用其方法进行匹配。

m1 = re.match(r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;',str)pattern2 = re.compile(r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;')m2 = pattern2.match(str)m3 = pattern2.search(str)m4 = pattern2.findall(str)

第一种方法适合只匹配一次的情况,pattern2适合于需要不断使用该模式的情况,使用match是对字符串从第一个字符开始匹配,使用search是在字符串中查询符合模式的子串(都只匹配一次);使用findall是匹配所有符合模式的子串(匹配多次)。

查看结果

使用match()或者search()方法匹配成功,m非None,可以对其匹配结果进行查看,group为其匹配的第一个符合的串,groups为其所有匹配的组。

if(m):    print m.group()    print m.groups()

使用findall()得到的m是一个列表,其中每一项是一个元组,包含匹配的每一组的字符串。

切分

re中提供的split方法可以按照一个模式将字符串切分成多个字符串,使用方法见下面的例子。

一个例子

import redef NC(str):    pattern = re.compile(r'^N(\d+)(\s+([GNXYZMTSF])[+-]?(\d+))+;')    strs = re.split(r'\n',str)    for s in strs:        m = pattern.match(s)        if(m):            print m.groups()with codecs.open('code.txt','r')as f:    NC(f.read())

这里的结果并不如预期的匹配所有数字以及地址符,字符串匹配成功,但组只有四组,只得到了最后一组的内容。说明这种组的方法所匹配的组数是固定的(括号对的个数)。

参考资料:
廖雪峰教程:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000
python正则表达式:
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

0 0