標籤:最佳化 異常 單詞 檔案讀取 pac search 唯讀 寫入 產生
檔案操作
開啟操作
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 序列化
將記憶體中Object Storage Service下來,把它變成一個個位元組。-> 二進位
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來相容。
Regex
. 匹配除分行符號外任意一個字元
[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之外的字元
凡是在Regex中有特殊意義的符號,如果想使用它的本意,請使用\轉義。
反斜線自身,得使用\
\r、\n還是轉義後代表斷行符號、換行
重複
- 前面的Regex重複0次或多次
- 前面的Regex重複至少一次
? 前面的Regex重複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
PythonRegex
re模組
編譯
re.compile(pattern, flags=0)
返回Regex對象regex
Regex編譯的結果儲存,下次使用同樣的pattern時不需要重新編譯
單次匹配
regex.match(string[, pos[, endpos]])
從字串開頭匹配,可指定開始與結束位置 返回match對象
regex.search(string[, pos[, endpos]])
從頭搜尋直到第一個匹配,可指定開始與結束位置 返回match對象
regex.fullmatch(string[, pos[, endpos]])
整個字串與Regex匹配
全文檢索搜尋
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,序列化還原序列化,Regex與python中使用