文件操作,路徑操作,StringIO和BytesIO,序列化反序列化,正則表達式與python中使用
打開操作
open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True,
opener=None)
打開一個文件,返回一個文件對象(流對象)和文件描述符。打開文件失敗,則返回異常
基本使用: 創建一個文件test,然後打開它,用完關閉
文件操作中,最常用的操作就是讀和寫。 文件訪問的模式有兩種:文本模式和二進制模式。不同模式下,操作函數
不盡相同,表現的結果也不一樣。
open的參數
file
打開或者要創建的文件名。如果不指定路徑,默認是當前路徑
open默認是只讀模式r打開已經存在的文件。
w 表示只寫方式打開,如果讀取則拋出異常 如果文件不存在,則直接創建文件 如果文件存在,則清空文件內容
x 文件不存在,創建文件,並只寫方式打開。文件存在,拋出FileExistsError異常
a 文件存在,只寫打開,追加內容 文件不存在,則創建後,只寫打開,追加內容
r是只讀,wxa都是只寫。 wxa都可以產生新文件,w不管文件存在與否,都會生成全新內容的文件;a不管文件是
否存在,都能在打開的文件尾部追加;x必須要求文件事先不存在,自己造一個新文件
文本模式t 字符流,將文件的字節按照某種字符編碼理解,按照字符操作。open的默認mode就是rt。
+為r、w、a、x提供缺失的讀或寫功能,但是,獲取文件對象依舊按照r、w、a、x自己的特征。 +不能單獨使用,
可以認為它是為前面的模式字符做增強功能的。
文件指針
上面的例子中,已經說明了有一個指針。
文件指針,指向當前字節位置
mode=r,指針起始在0 mode=a,指針起始在EOF
tell() 顯示指針當前位置
seek(offset[, whence]) 移動文件指針位置。offest偏移多少字節,whence從哪裏開始。
文本模式下 whence 0 缺省值,表示從頭開始,offest只能正整數 whence 1 表示從當前位置,offest只接受0
buffering:緩沖區
-1 表示使用缺省大小的buffer。如果是二進制模式,使用io.DEFAULT_BUFFER_SIZE值,默認是4096或者8192。
如果是文本模式,如果是終端設備,是行緩存方式,如果不是,則使用二進制模式的策略。
0 只在二進制模式使用,表示關buffer
1 只在文本模式使用,表示使用行緩沖。意思就是見到換行符就flush
大於1 用於指定buffer的大小
buffer 緩沖區
緩沖區一個內存空間,一般來說是一個FIFO隊列,到緩沖區滿了或者達到閾值,數據才會flush到磁盤。
flush() 將緩沖區數據寫入磁盤 close() 關閉前會調用flush()
1 文本模式,一般都用默認緩沖區大小
2 二進制模式,是一個個字節的操作,可以指定buffer的大小
3一般來說,默認緩沖區大小是個比較好的選擇,除非明確知道,否則不調整它
一般編程中,明確知道需要寫磁盤了,都會手動調用一次flush,而不是等到自動flush或者close的時候
read
read(size=-1)
size表示讀取的多少個字符或字節;負數或者None表示讀取到EOF
行讀取
readline(size=-1)
一行行讀取文件內容。size設置一次能讀取行內幾個字符或字節。
readlines(hint=-1)
讀取所有行的列表。指定hint則返回指定的行數。
write
write(s),把字符串s寫入到文件中並返回字符的個數 writelines(lines),將字符串列表寫入文件。
close
flush並關閉文件對象。
文件已經關閉,再次關閉沒有任何效果。
上下文管理
1 使用with ... as 關鍵字
2上下文管理的語句塊並不會開啟新的作用域
3with語句塊執行完的時候,會自動關閉文件對象
StringIO
? io模塊中的類
? from io import StringIO
? 內存中,開辟的一個文本模式的buffer,可以像文件對象一樣操作它
? 當close方法被調用的時候,這個buffer會被釋放
getvalue() 獲取全部內容。跟文件指針沒有關系
好處
一般來說,磁盤的操作比內存的操作要慢得多,內存足夠的情況下,一般的優化思路是少落地,減少
磁盤IO的過程,可以大大提高程序的運行效率
BytesIO
? io模塊中的類
? from io import BytesIO
? 內存中,開辟的一個二進制模式的buffer,可以像文件對象一樣操作它
? 當close方法被調用的時候,這個buffer會被釋放
file-like對象
? 類文件對象,可以像文件對象一樣操作
? socket對象、輸入輸出對象(stdin、stdout)都是類文件對象
路徑操作
路徑操作模塊
3.4版本之前
os.path模塊
3.4版本開始
建議使用pathlib模塊,提供Path對象來操作。包括目錄和文件。
pathlib模塊
from pathlib import Path
路徑拼接和分解
操作符/
Path對象 / Path對象
Path對象 / 字符串 或者 字符串 / Path對象
分解
parts屬性,可以返回路徑中的每一個部分
joinpath
joinpath(*other) 連接多個字符串到Path對象中
獲取路徑
str 獲取路徑字符串
bytes 獲取路徑字符串的bytes
父目錄
parent 目錄的邏輯父目錄
parents 父目錄序列,索引0是直接的父
目錄組成部分
name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
name 目錄的最後一個部分
suffix 目錄中最後一個部分的擴展名
stem 目錄最後一個部分,沒有後綴
suffixes 返回多個擴展名列表
with_suffix(suffix) 有擴展名則替換,無則補充擴展名
with_name(name) 替換目錄最後一個部分並返回一個新的路徑
全局方法
cwd() 返回當前工作目錄
home() 返回當前家目錄
判斷方法
is_dir() 是否是目錄,目錄存在返回True
is_file() 是否是普通文件,文件存在返回True
is_symlink() 是否是軟鏈接
is_socket() 是否是socket文件
is_block_device() 是否是塊設備
is_char_device() 是否是字符設備
is_absolute() 是否是絕對路徑
resolve() 返回一個新的路徑,這個新路徑就是當前Path對象的絕對路徑,如果是軟鏈接則直接被解析
absolute() 獲取絕對路徑
exists() 目錄或文件是否存在
rmdir() 刪除空目錄。沒有提供判斷目錄為空的方法
touch(mode=0o666, exist_ok=True) 創建一個文件
as_uri() 將路徑返回成URI通配符
glob(pattern) 通配給定的模式
rglob(pattern) 通配給定的模式,遞歸目錄
都返回一個生成器
匹配
match(pattern)
模式匹配,成功返回True
stat() 相當於stat命令
lstat() 同stat(),但如果是符號鏈接,則顯示符號鏈接本身的文件信息
文件操作
Path.open(mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None)
使用方法類似內建函數open。返回一個文件對象
3.5增加的新函數
Path.read_bytes()
以‘rb‘讀取路徑對應文件,並返回二進制流。看源碼
Path.read_text(encoding=None, errors=None)
以‘rt‘方式讀取路徑對應文件,返回文本。
Path.write_bytes(data)
以‘wb‘方式寫入數據到路徑對應文件。
Path.write_text(data, encoding=None, errors=None)
以‘wt‘方式寫入字符串到路徑對應文件。
序列化和反序列化
定義
serialization 序列化
將內存中對象存儲下來,把它變成一個個字節。-> 二進制
deserialization 反序列化
將文件的一個個字節恢復成內存中對象。<- 二進制
序列化保存到文件就是持久化。
可以將數據序列化後持久化,或者網絡傳輸;也可以將從文件中或者網絡接收到的字節序列反序列化。
Python 提供了pickle 庫。
pickle庫
Python中的序列化、反序列化模塊。
dumps 對象序列化為bytes對象
dump 對象序列化到文件對象,就是存入文件
loads 從bytes對象反序列化
load 對象反序列化,從文件讀取數據
Json
JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。它基於 ECMAScript (w3c組織制定
的JS規範)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。
Json的數據類型
值
雙引號引起來的字符串,數值,true和false,null,對象,數組,這些都是值
字符串
由雙引號包圍起來的任意字符的組合,可以有轉義字符。
數值
有正負,有整數、浮點數。
對象
無序的鍵值對的集合
格式: {key1:value1, ... ,keyn:valulen}
key必須是一個字符串,需要雙引號包圍這個字符串。
value可以是任意合法的值。
數組
有序的值的集合
Python支持少量內建數據類型到Json類型的轉換。
常用方法
python類型 json類型
dumps json編碼
dump json編碼並存入文件
loads json解碼
load json解碼並存入文件
一般json編碼的數據很少落地,數據都是通過網絡傳輸。傳輸的時候,要考慮壓縮它。
本質上來說它就是個文本,就是個字符串。
json很簡單,幾乎語言編程都支持Json,所以應用範圍十分廣泛。
MessagePack
MessagePack是一個基於二進制高效的對象序列化類庫,可用於跨語言通信。
它可以像JSON那樣,在許多種語言之間交換結構對象。
但是它比JSON更快速也更輕巧。
支持Python、Ruby、Java、C/C++等眾多語言。宣稱比Google Protocol Buffers還要快4倍。
兼容 json和pickle。
常用方法
packb 序列化對象。提供了dumps來兼容pickle和json。
unpackb 反序列化對象。提供了loads來兼容。
pack 序列化對象保存到文件對象。提供了dump來兼容。
unpack 反序列化對象保存到文件對象。提供了load來兼容。
正則表達式
. 匹配除換行符外任意一個字符
[abc] 字符集合,只能表示一個字符位置。匹配所包含的任意一個字符
[^abc] 字符集合,只能表示一個字符位置。匹配除去集合內字符的任意一個字符
[a-z] 字符範圍,一個集合,表示一個字符位置匹配所包含的任意一個字符
[^a-z] 字符範圍,一個集合,表示一個字符位置匹配除去集合內字符的任意一個字符
\b 匹配單詞的邊界
\B 不匹配單詞的邊界
\d 等同[0-9] 匹配一位數字
\D 等同[^0-9] 匹配一位非數字
\s 匹配1位空白字符,包括換行符、制表符、空格等同[\f\r\n\t\v]
\S 匹配1位非空白字符
\w 等同[a-zA-Z0-9_] 包含中文
\W 匹配\w之外的字符
凡是在正則表達式中有特殊意義的符號,如果想使用它的本意,請使用\轉義。
反斜杠自身,得使用\
\r、\n還是轉義後代表回車、換行
重復
- 前面的正則表達式重復0次或多次
- 前面的正則表達式重復至少一次
? 前面的正則表達式重復0次或1次
{n} 重復n次
{n,} 重復n次以上
{n,m} 重復n到m次
分組(捕獲)斷言
x y 匹配x或y
(pattern) 分組(捕獲)後會自動分配組號從1開始可以改變優先級 \數字 匹配對應的分組(指的是前一個匹配上的分組的內容)
(?:pattern) 只改變優先級不分組
(?<name>exp)(?nameexp) 分組捕獲 給組命名Python句法為(?P<name>exp)
(?=exp) 零寬度正預測先行斷言斷言exp一定在匹配的右邊出現
(?<=exp) 零寬度正回顧後發斷言斷言exp一定出現在匹配的左邊出現
(?!exp) 零寬度負預測先行斷言斷言exp一定不會出現在右側
(?<!exp) 零寬度負回顧後發斷言斷言exp一定不會出現在左側
(?#comment) 註釋
貪婪與非貪婪
默認貪婪模式,盡可能多的匹配字符串
*? 匹配任意次,盡可能少重復
+? 匹配至少一次,盡可能少重復
?? 匹配0或1次,盡可能少重復
{n}? 匹配至少n次,盡可能少重復
{n,m}? 匹配至少n次,至多m次,盡可能少重復
引擎選項
IgnoreCase 匹配時忽略大小寫 re.Ire.IGNORECASE
Singleline 單行模式,可穿透/n re.Sre.DOTALL
Multiline 多行模式 re.Mre.MULTILINE
IgnorePatternWhitespace 忽略表達式中空白字符,若要使用空白
單行模式:
. 可以匹配所有字符,包括換行符。
^ 表示整個字符串的開頭,$整個字符串的結尾
多行模式:
. 可以匹配除了換行符之外的字符。
^ 表示行首,$行尾
^ 表示整個字符串的開始,$ 表示整個字符串的結尾。開始指的是\n後緊接著下一個字符,結束指的是/n前的字符
可以認為,單行模式就如同看穿了換行符,所有文本就是一個長長的只有一行的字符串,所以^就是這一行字符串的行
首,$就是這一行的行尾。
多行模式,無法穿透換行符,^和$還是行首行尾的意思,只不過限於每一行
註意:註意字符串中看不見的換行符,\r\n會影響e$的測試,e$只能匹配e\n
Python正則表達式
re模塊
編譯
re.compile(pattern, flags=0)
返回正則表達式對象regex
正則表達式編譯的結果保存,下次使用同樣的pattern時不需要重新編譯
單次匹配
regex.match(string[, pos[, endpos]])
從字符串開頭匹配,可指定開始與結束位置 返回match對象
regex.search(string[, pos[, endpos]])
從頭搜索直到第一個匹配,可指定開始與結束位置 返回match對象
regex.fullmatch(string[, pos[, endpos]])
整個字符串與正則表達式匹配
全文搜索
regex.findall(string[, pos[, endpos]])
對整個字符串從左至右匹配,返回所有匹配項的列表
regex.finditer(string[, pos[, endpos]])
對整個字符串,從左至右匹配,返回所有匹配項的叠代器,每項都是match對象
匹配替換
regex.sub(replacement, string, count=0)
使用pattern對字符串string進行匹配,對匹配項用replacement替換
replacement可以是string、bytes、function
regex.subn(replacement, string, count=0)
功能類似sub 返回一個元組 (new_string, number_of_subs_made)
分割字符串
regex.split(string, maxsplit=0)
返回列表
分組
使用(pattern)捕獲的數據放到組中
match類方法
group(N)
1-N時對應的分組 0但會整個匹配的字符串
如果使用了命名分組,可用group(name)方式取出
groups()
返回所有組的一個元組
groupdict()
返回所有命名分組的字典
文件操作,路徑操作,StringIO和BytesIO,序列化反序列化,正則表達式與python中使用