檔案操作,路徑操作,StringIO和BytesIO,序列化還原序列化,Regex與python中使用

來源:互聯網
上載者:User

標籤:最佳化   異常   單詞   檔案讀取   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中使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.