天天看點

python 檔案處理、資料持久化與正則

一、檔案的處理

  資料持久化最簡單的類型就是普通檔案,有時也叫做平面檔案(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)

繼續閱讀