1. 程式人生 > >文件操作,路徑操作,StringIO和BytesIO,序列化反序列化,正則表達式與python中使用

文件操作,路徑操作,StringIO和BytesIO,序列化反序列化,正則表達式與python中使用

基於 關系 判斷目錄 java、 優先 errors 情況下 water des

文件操作

打開操作
open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True,
opener=None)
打開一個文件,返回一個文件對象(流對象)和文件描述符。打開文件失敗,則返回異常
基本使用: 創建一個文件test,然後打開它,用完關閉
文件操作中,最常用的操作就是讀和寫。 文件訪問的模式有兩種:文本模式和二進制模式。不同模式下,操作函數
不盡相同,表現的結果也不一樣。
open的參數
file
打開或者要創建的文件名。如果不指定路徑,默認是當前路徑
open默認是只讀模式r打開已經存在的文件。

r 只讀打開文件,如果使用write方法,會拋異常。 如果文件不存在,拋出FileNotFoundError異常
w 表示只寫方式打開,如果讀取則拋出異常 如果文件不存在,則直接創建文件 如果文件存在,則清空文件內容
x 文件不存在,創建文件,並只寫方式打開。文件存在,拋出FileExistsError異常
a 文件存在,只寫打開,追加內容 文件不存在,則創建後,只寫打開,追加內容
r是只讀,wxa都是只寫。 wxa都可以產生新文件,w不管文件存在與否,都會生成全新內容的文件;a不管文件是
否存在,都能在打開的文件尾部追加;x必須要求文件事先不存在,自己造一個新文件
文本模式t 字符流,將文件的字節按照某種字符編碼理解,按照字符操作。open的默認mode就是rt。
二進制模式b 字節流,將文件就按照字節理解,與字符編碼無關。二進制模式操作時,字節操作使用bytes類型
+為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

whence 2 表示從EOF開始,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中使用