python學習筆記(五)文件操作、正則表達式

文件操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章