文件操作
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 codecs
with 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 re
def 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())
这里的结果并不如预期的匹配所有数字以及地址符,字符串匹配成功,但组只有四组,只得到了最后一组的内容。说明这种组的方法所匹配的组数是固定的(括号对的个数)。