文件操作
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())
這裏的結果並不如預期的匹配所有數字以及地址符,字符串匹配成功,但組只有四組,只得到了最後一組的內容。說明這種組的方法所匹配的組數是固定的(括號對的個數)。
參考資料:
廖雪峯教程:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000
python正則表達式:
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html