一、檔案的處理
資料持久化最簡單的類型就是普通檔案,有時也叫做平面檔案(flat file)。檔案是計算機中由OS(作業系統)管理的具有名字的存儲區域,在linux系統上,檔案被看作是位元組序列。
fileobj=open(filename, mode,buffering=-1,...) 打開檔案
fileobj是open()函數傳回的檔案對象
filename需要打開的檔案的字元串名
buffering:是否使用緩存,0表示輸出無緩存,1表示使用緩存;
負數表示使用預設設定,正數表示使用近似指定的大小。
mode指定檔案的打開模式:
r表示讀模式
r+表示可讀寫檔案。【可讀;可寫;可追加】
w表示寫模式,如果檔案不存在則新建立,如果存在則重新些内容
w+,寫讀
x表示檔案不存在的情況下新建立并寫檔案。
a表示檔案如果存在,在檔案末尾追加内容。
"U"表示在讀取時,可以将 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
mode的第二個字母代表檔案的類型:t代表文本類型,b代表二進制檔案
檔案的操作方法:
f.read([n])
做多讀取n個位元組
f.readline([n])
讀取單行輸入的做多n個位元組,如果省略n,該方法将讀取整行
f.readlines([size])
讀取所有行并傳回一個清單,size可選,用于指定在讀取操作停止前在檔案上讀取的近似字元數
f.write(s)
寫入字元串
f.writelines(lines)
寫入序列lines中的所有字元串
f.close()
關閉檔案
f.tell
傳回目前檔案的指針
f.seek(offset [,whence])
跳轉到檔案其他位元組偏移量的位置
whence:0(預設)表示從開頭偏移offset個位元組
whence:1表示從目前位置處偏移offset個位元組
whence:2表示從距離檔案結尾處偏移offset個位元組
f.isatty()
如果f是一個互動式終端,則傳回1
f.flush()
清除輸出緩沖區
f.truncate([size])
将檔案截斷為最多size位元組
f.fileno()
傳回一個整數描述符
f.next()
傳回下一行或引發stopIteration,python3中,對應方法f.__next__()
使用with自動關閉檔案:
當打開檔案進行操作後忘記關閉時,在該檔案對象不再被引用後python會關掉此檔案。這意味着在一個函數中打開檔案,沒有及時關閉它,函數結束時會被關閉。但是當一直運作中的函數或者程式的主要部分打開一個檔案,應該強制剩下的所有寫操作完成後才關閉檔案。
python的上下文管理器會清理一些資源,例如打開檔案。形式為:with context as var:statements
完成代碼編輯後檔案自動關閉。
二、對象流式化與持久化存儲
Python 程式在實作檔案讀取或寫出時,要使用轉換工具把對象轉換成字元串。持久性的基本思想很簡單,假定有一個Python 程式,它可能是一個管理日常待辦事項的程式,你希望在多次執行這個程式之間可以儲存應用程式對象,此時就需要持久存儲對象内容。python中隻要有三個子產品用于流式化或持久化存儲資料:
json, 用于字元串和python資料類型間進行轉換
pickle 子產品 (将對象轉換為檔案存儲),讀寫檔案時應使用二進制打開
shelve 子產品(自動将對象pickle進和pickle出鍵轉換為檔案系統,按字典方式查詢方式)
pickle、Json 子產品提供了四個功能:dumps、dump、loads、load,而shelve子產品通過open函數打開shelve對象後,就可以相當于字典一樣操作。
dump(object, file)
dumps(object) -> string
将對象obj儲存到檔案file中去。
load(file) -> object
loads(string) -> object
從 file 中讀取一個字元串,并将它重構為原來的python對象。
shelve子產品
d = shelve.open(filename) # 打開檔案,d 相當于字典對象
三、正則處理re子產品
python中正規表達式的處理使用re子產品。其主要方法有:
search(pattern, string, flags=0)
根據patter模式,在string字元串中傳回第一次比對到的
match對象。
符号标志:
I或IGNORECASE:忽略字元大小寫
M或MULTILINE:跨行比對
A或 ASCII:僅執行8位ASCII碼比對
U或UNICODE:執行UNICODE 碼比對
match(pattern, string, flags=0)
根據pattern比對,傳回一個match對象,隻能檢測字元串作為開頭的源字元串。
match對象的屬性:
string: 比對的源字元串
re: 需要比對的pattern
pos: 源字元串搜尋的起始位置
endpos: 源字元串搜尋的結束位置
match對象的方法:
group(): 比對到的結果
groups():比對到的分組結果以元組形式傳回。
start(): 比對到字元串的起始位置
end(): 比對到字元串的結束位置
findall(pattern, string, flags=0)
以清單的方式,傳回所有不重複的比對對象
sub(pattern, repl, string, count=0, flags=0)
傳回替換後整個串
subn(pattern, repl, string, count=0, flags=0)
傳回元組替換後的串及替換次數
compile(pattern, flags=0)
手動編譯模式對象,将正規表達式編譯成Pattern對象
split(string[, maxsplit])
split(pattern, string[,maxsplit])
按照能夠比對的子串将string分割後傳回清單。
maxsplit用于指定最大分割次數,不指定将全部分割
正則比對規則:
文法
說明
表達式執行個體
完整比對的規則
字元
.
比對任意除換行符'\n'外的字元
a.b
aab
\
轉義字元,使後一個字元改變原來的意思
a\.e
a.e
[...]
字元集。對應的位置可以是字元集中任意一個字元。
a[bc]d
abd,acd
預定義字元集
\d
數字[0-9]
a\db
a1b
\D
非數字[^0-9]
a\Db
abb
\s
空白字元
a\sb
a b
\S
非空白字元
a\Sb
\w
單詞字元[a-zA-Z0-9]
a\wb
abb,a1b,aWb
\W
非單詞字元
a\Wb
a b,a-b,a*b
數量比對
*
比對前一個字元0次或多次
ab*
a,ab,abb
+
比對前一個字元1次或多次
ab+
ab,abb
?
比對前一個字元0次或1次
ab?
a,ab
{m}
比對前一個字元m次
ab{3}c
abbbc
{m,n}
比對前一個字元m至n次
ab{1,2}c
abc,abbc
邊界比對
^
比對字元串開頭
^ab
ab
$
比對字元串結尾
ab$
\A
僅比對字元串開頭
\Aabc
abc
\Z
僅比對字元串結尾
abc\Z
\b
比對字元串邊界
cl\\b
ass\\b
'class'中cl無法比對;
'class'中ass可以比對
\B
不比對字元串邊界
cl\B
ass\B
'class'中cl可以比對;
'class'中ass無法比對
邏輯與分組
|
左右表達式任意比對一個
abc|abd
abc,abd
(...)
如: \(ab\)*,将 ab 作為一個整體比對
\n: 後向引用, 引用前面的第 n 個左括号以及與之對應的右括号中的模式所比對
到的内容
(abc){2}
a(123|456)c
abcabc
a123c,a456c
(?P<name>...)
分組,除了原有的編号外,再指定一個額外的别名
(?P<id>abc)2
\<number>
引用編号為<number>的分組比對到的字元串
(\d)abc\1
5abc5
2abc2
(?=name)
引用别名為name比對到的字元串
(?P<id>\d)abc(?P=id)