溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-07-31 08:48:33 來源:網(wǎng)絡(luò) 閱讀:784 作者:shadowkg 欄目:編程語言

文件操作

打開操作
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True,
opener=None)
打開一個(gè)文件,返回一個(gè)文件對(duì)象(流對(duì)象)和文件描述符。打開文件失敗,則返回異常
基本使用: 創(chuàng)建一個(gè)文件test,然后打開它,用完關(guān)閉
文件操作中,最常用的操作就是讀和寫。 文件訪問的模式有兩種:文本模式和二進(jìn)制模式。不同模式下,操作函數(shù)
不盡相同,表現(xiàn)的結(jié)果也不一樣。
open的參數(shù)
file
打開或者要?jiǎng)?chuàng)建的文件名。如果不指定路徑,默認(rèn)是當(dāng)前路徑
open默認(rèn)是只讀模式r打開已經(jīng)存在的文件。
r 只讀打開文件,如果使用write方法,會(huì)拋異常。 如果文件不存在,拋出FileNotFoundError異常
w 表示只寫方式打開,如果讀取則拋出異常 如果文件不存在,則直接創(chuàng)建文件 如果文件存在,則清空文件內(nèi)容
x 文件不存在,創(chuàng)建文件,并只寫方式打開。文件存在,拋出FileExistsError異常
a 文件存在,只寫打開,追加內(nèi)容 文件不存在,則創(chuàng)建后,只寫打開,追加內(nèi)容
r是只讀,wxa都是只寫。 wxa都可以產(chǎn)生新文件,w不管文件存在與否,都會(huì)生成全新內(nèi)容的文件;a不管文件是
否存在,都能在打開的文件尾部追加;x必須要求文件事先不存在,自己造一個(gè)新文件
文本模式t 字符流,將文件的字節(jié)按照某種字符編碼理解,按照字符操作。open的默認(rèn)mode就是rt。
二進(jìn)制模式b 字節(jié)流,將文件就按照字節(jié)理解,與字符編碼無關(guān)。二進(jìn)制模式操作時(shí),字節(jié)操作使用bytes類型
+為r、w、a、x提供缺失的讀或?qū)懝δ?,但是,獲取文件對(duì)象依舊按照r、w、a、x自己的特征。 +不能單獨(dú)使用,
可以認(rèn)為它是為前面的模式字符做增強(qiáng)功能的。
文件指針
上面的例子中,已經(jīng)說明了有一個(gè)指針。
文件指針,指向當(dāng)前字節(jié)位置
mode=r,指針起始在0 mode=a,指針起始在EOF
tell() 顯示指針當(dāng)前位置
seek(offset[, whence]) 移動(dòng)文件指針位置。offest偏移多少字節(jié),whence從哪里開始。

文本模式下 whence 0 缺省值,表示從頭開始,offest只能正整數(shù) whence 1 表示從當(dāng)前位置,offest只接受0
whence 2 表示從EOF開始,offest只接受0
buffering:緩沖區(qū)
-1 表示使用缺省大小的buffer。如果是二進(jìn)制模式,使用io.DEFAULT_BUFFER_SIZE值,默認(rèn)是4096或者8192。
如果是文本模式,如果是終端設(shè)備,是行緩存方式,如果不是,則使用二進(jìn)制模式的策略。
0 只在二進(jìn)制模式使用,表示關(guān)buffer
1 只在文本模式使用,表示使用行緩沖。意思就是見到換行符就flush
大于1 用于指定buffer的大小
buffer 緩沖區(qū)
緩沖區(qū)一個(gè)內(nèi)存空間,一般來說是一個(gè)FIFO隊(duì)列,到緩沖區(qū)滿了或者達(dá)到閾值,數(shù)據(jù)才會(huì)flush到磁盤。
flush() 將緩沖區(qū)數(shù)據(jù)寫入磁盤 close() 關(guān)閉前會(huì)調(diào)用flush()
1 文本模式,一般都用默認(rèn)緩沖區(qū)大小
2 二進(jìn)制模式,是一個(gè)個(gè)字節(jié)的操作,可以指定buffer的大小
3一般來說,默認(rèn)緩沖區(qū)大小是個(gè)比較好的選擇,除非明確知道,否則不調(diào)整它
一般編程中,明確知道需要寫磁盤了,都會(huì)手動(dòng)調(diào)用一次flush,而不是等到自動(dòng)flush或者close的時(shí)候
read
read(size=-1)
size表示讀取的多少個(gè)字符或字節(jié);負(fù)數(shù)或者None表示讀取到EOF
行讀取
readline(size=-1)
一行行讀取文件內(nèi)容。size設(shè)置一次能讀取行內(nèi)幾個(gè)字符或字節(jié)。
readlines(hint=-1)
讀取所有行的列表。指定hint則返回指定的行數(shù)。
write
write(s),把字符串s寫入到文件中并返回字符的個(gè)數(shù) writelines(lines),將字符串列表寫入文件。
close
flush并關(guān)閉文件對(duì)象。
文件已經(jīng)關(guān)閉,再次關(guān)閉沒有任何效果。
上下文管理
1 使用with ... as 關(guān)鍵字
2上下文管理的語句塊并不會(huì)開啟新的作用域
3with語句塊執(zhí)行完的時(shí)候,會(huì)自動(dòng)關(guān)閉文件對(duì)象
StringIO
? io模塊中的類
? from io import StringIO
? 內(nèi)存中,開辟的一個(gè)文本模式的buffer,可以像文件對(duì)象一樣操作它
? 當(dāng)close方法被調(diào)用的時(shí)候,這個(gè)buffer會(huì)被釋放
getvalue() 獲取全部?jī)?nèi)容。跟文件指針沒有關(guān)系
好處
一般來說,磁盤的操作比內(nèi)存的操作要慢得多,內(nèi)存足夠的情況下,一般的優(yōu)化思路是少落地,減少
磁盤IO的過程,可以大大提高程序的運(yùn)行效率
BytesIO
? io模塊中的類
? from io import BytesIO
? 內(nèi)存中,開辟的一個(gè)二進(jìn)制模式的buffer,可以像文件對(duì)象一樣操作它
? 當(dāng)close方法被調(diào)用的時(shí)候,這個(gè)buffer會(huì)被釋放
file-like對(duì)象
? 類文件對(duì)象,可以像文件對(duì)象一樣操作
? socket對(duì)象、輸入輸出對(duì)象(stdin、stdout)都是類文件對(duì)象
路徑操作
路徑操作模塊
3.4版本之前
os.path模塊
3.4版本開始
建議使用pathlib模塊,提供Path對(duì)象來操作。包括目錄和文件。
pathlib模塊
from pathlib import Path
路徑拼接和分解
操作符/
Path對(duì)象 / Path對(duì)象
Path對(duì)象 / 字符串 或者 字符串 / Path對(duì)象
分解
parts屬性,可以返回路徑中的每一個(gè)部分
joinpath
joinpath(*other) 連接多個(gè)字符串到Path對(duì)象中

獲取路徑
str 獲取路徑字符串
bytes 獲取路徑字符串的bytes
父目錄
parent 目錄的邏輯父目錄
parents 父目錄序列,索引0是直接的父
目錄組成部分
name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
name 目錄的最后一個(gè)部分
suffix 目錄中最后一個(gè)部分的擴(kuò)展名
stem 目錄最后一個(gè)部分,沒有后綴
suffixes 返回多個(gè)擴(kuò)展名列表
with_suffix(suffix) 有擴(kuò)展名則替換,無則補(bǔ)充擴(kuò)展名
with_name(name) 替換目錄最后一個(gè)部分并返回一個(gè)新的路徑
全局方法
cwd() 返回當(dāng)前工作目錄
home() 返回當(dāng)前家目錄
判斷方法
is_dir() 是否是目錄,目錄存在返回True
is_file() 是否是普通文件,文件存在返回True
is_symlink() 是否是軟鏈接
is_socket() 是否是socket文件
is_block_device() 是否是塊設(shè)備
is_char_device() 是否是字符設(shè)備
is_absolute() 是否是絕對(duì)路徑
resolve() 返回一個(gè)新的路徑,這個(gè)新路徑就是當(dāng)前Path對(duì)象的絕對(duì)路徑,如果是軟鏈接則直接被解析
absolute() 獲取絕對(duì)路徑
exists() 目錄或文件是否存在
rmdir() 刪除空目錄。沒有提供判斷目錄為空的方法
touch(mode=0o666, exist_ok=True) 創(chuàng)建一個(gè)文件
as_uri() 將路徑返回成URI通配符
glob(pattern) 通配給定的模式
rglob(pattern) 通配給定的模式,遞歸目錄
都返回一個(gè)生成器
匹配
match(pattern)
模式匹配,成功返回True
stat() 相當(dāng)于stat命令
lstat() 同stat(),但如果是符號(hào)鏈接,則顯示符號(hào)鏈接本身的文件信息
文件操作
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
使用方法類似內(nèi)建函數(shù)open。返回一個(gè)文件對(duì)象
3.5增加的新函數(shù)
Path.read_bytes()
以'rb'讀取路徑對(duì)應(yīng)文件,并返回二進(jìn)制流??丛创a
Path.read_text(encoding=None, errors=None)
以'rt'方式讀取路徑對(duì)應(yīng)文件,返回文本。
Path.write_bytes(data)
以'wb'方式寫入數(shù)據(jù)到路徑對(duì)應(yīng)文件。
Path.write_text(data, encoding=None, errors=None)
以'wt'方式寫入字符串到路徑對(duì)應(yīng)文件。
序列化和反序列化
定義
serialization 序列化
將內(nèi)存中對(duì)象存儲(chǔ)下來,把它變成一個(gè)個(gè)字節(jié)。-> 二進(jìn)制
deserialization 反序列化
將文件的一個(gè)個(gè)字節(jié)恢復(fù)成內(nèi)存中對(duì)象。<- 二進(jìn)制
序列化保存到文件就是持久化。
可以將數(shù)據(jù)序列化后持久化,或者網(wǎng)絡(luò)傳輸;也可以將從文件中或者網(wǎng)絡(luò)接收到的字節(jié)序列反序列化。
Python 提供了pickle 庫(kù)。
pickle庫(kù)
Python中的序列化、反序列化模塊。
dumps 對(duì)象序列化為bytes對(duì)象
dump 對(duì)象序列化到文件對(duì)象,就是存入文件
loads 從bytes對(duì)象反序列化
load 對(duì)象反序列化,從文件讀取數(shù)據(jù)
Json
JSON(JavaScript Object Notation, JS 對(duì)象標(biāo)記) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于 ECMAScript (w3c組織制定
的JS規(guī)范)的一個(gè)子集,采用完全獨(dú)立于編程語言的文本格式來存儲(chǔ)和表示數(shù)據(jù)。
Json的數(shù)據(jù)類型

雙引號(hào)引起來的字符串,數(shù)值,true和false,null,對(duì)象,數(shù)組,這些都是值
字符串
由雙引號(hào)包圍起來的任意字符的組合,可以有轉(zhuǎn)義字符。
數(shù)值
有正負(fù),有整數(shù)、浮點(diǎn)數(shù)。
對(duì)象
無序的鍵值對(duì)的集合
格式: {key1:value1, ... ,keyn:valulen}
key必須是一個(gè)字符串,需要雙引號(hào)包圍這個(gè)字符串。
value可以是任意合法的值。
數(shù)組
有序的值的集合
Python支持少量?jī)?nèi)建數(shù)據(jù)類型到Json類型的轉(zhuǎn)換。文件操作,路徑操作,StringIO和BytesIO,序列化反序列化,正則表達(dá)式與python中使用
常用方法
python類型 json類型
dumps json編碼
dump json編碼并存入文件
loads json解碼
load json解碼并存入文件
一般json編碼的數(shù)據(jù)很少落地,數(shù)據(jù)都是通過網(wǎng)絡(luò)傳輸。傳輸?shù)臅r(shí)候,要考慮壓縮它。
本質(zhì)上來說它就是個(gè)文本,就是個(gè)字符串。
json很簡(jiǎn)單,幾乎語言編程都支持Json,所以應(yīng)用范圍十分廣泛。
MessagePack
MessagePack是一個(gè)基于二進(jìn)制高效的對(duì)象序列化類庫(kù),可用于跨語言通信。
它可以像JSON那樣,在許多種語言之間交換結(jié)構(gòu)對(duì)象。
但是它比JSON更快速也更輕巧。
支持Python、Ruby、Java、C/C++等眾多語言。宣稱比Google Protocol Buffers還要快4倍。
兼容 json和pickle。
常用方法
packb 序列化對(duì)象。提供了dumps來兼容pickle和json。
unpackb 反序列化對(duì)象。提供了loads來兼容。
pack 序列化對(duì)象保存到文件對(duì)象。提供了dump來兼容。
unpack 反序列化對(duì)象保存到文件對(duì)象。提供了load來兼容。
正則表達(dá)式

. 匹配除換行符外任意一個(gè)字符
[abc] 字符集合,只能表示一個(gè)字符位置。匹配所包含的任意一個(gè)字符
[^abc] 字符集合,只能表示一個(gè)字符位置。匹配除去集合內(nèi)字符的任意一個(gè)字符
[a-z] 字符范圍,一個(gè)集合,表示一個(gè)字符位置匹配所包含的任意一個(gè)字符
[^a-z] 字符范圍,一個(gè)集合,表示一個(gè)字符位置匹配除去集合內(nèi)字符的任意一個(gè)字符
\b 匹配單詞的邊界
\B 不匹配單詞的邊界
\d 等同[0-9] 匹配一位數(shù)字
\D 等同[^0-9] 匹配一位非數(shù)字
\s 匹配1位空白字符,包括換行符、制表符、空格等同[\f\r\n\t\v]
\S 匹配1位非空白字符
\w 等同[a-zA-Z0-9_] 包含中文
\W 匹配\w之外的字符

凡是在正則表達(dá)式中有特殊意義的符號(hào),如果想使用它的本意,請(qǐng)使用\轉(zhuǎn)義。
反斜杠自身,得使用\
\r、\n還是轉(zhuǎn)義后代表回車、換行

重復(fù)

  • 前面的正則表達(dá)式重復(fù)0次或多次
  • 前面的正則表達(dá)式重復(fù)至少一次
    ? 前面的正則表達(dá)式重復(fù)0次或1次
    {n} 重復(fù)n次
    {n,} 重復(fù)n次以上
    {n,m} 重復(fù)n到m次

分組(捕獲)斷言

x y 匹配x或y
(pattern) 分組(捕獲)后會(huì)自動(dòng)分配組號(hào)從1開始可以改變優(yōu)先級(jí) \數(shù)字 匹配對(duì)應(yīng)的分組(指的是前一個(gè)匹配上的分組的內(nèi)容)
(?:pattern) 只改變優(yōu)先級(jí)不分組
(?<name>exp)(?nameexp) 分組捕獲 給組命名Python句法為(?P<name>exp)
(?=exp) 零寬度正預(yù)測(cè)先行斷言斷言exp一定在匹配的右邊出現(xiàn)
(?<=exp) 零寬度正回顧后發(fā)斷言斷言exp一定出現(xiàn)在匹配的左邊出現(xiàn)
(?!exp) 零寬度負(fù)預(yù)測(cè)先行斷言斷言exp一定不會(huì)出現(xiàn)在右側(cè)
(?<!exp) 零寬度負(fù)回顧后發(fā)斷言斷言exp一定不會(huì)出現(xiàn)在左側(cè)
(?#comment) 注釋

貪婪與非貪婪
默認(rèn)貪婪模式,盡可能多的匹配字符串

*? 匹配任意次,盡可能少重復(fù)
+? 匹配至少一次,盡可能少重復(fù)
?? 匹配0或1次,盡可能少重復(fù)
{n}? 匹配至少n次,盡可能少重復(fù)
{n,m}? 匹配至少n次,至多m次,盡可能少重復(fù)

引擎選項(xiàng)

IgnoreCase 匹配時(shí)忽略大小寫 re.Ire.IGNORECASE
Singleline 單行模式,可穿透/n re.Sre.DOTALL
Multiline 多行模式 re.Mre.MULTILINE
IgnorePatternWhitespace 忽略表達(dá)式中空白字符,若要使用空白

單行模式:
. 可以匹配所有字符,包括換行符。
^ 表示整個(gè)字符串的開頭,$整個(gè)字符串的結(jié)尾
多行模式:
. 可以匹配除了換行符之外的字符。
^ 表示行首,$行尾
^ 表示整個(gè)字符串的開始,$ 表示整個(gè)字符串的結(jié)尾。開始指的是\n后緊接著下一個(gè)字符,結(jié)束指的是/n前的字符
可以認(rèn)為,單行模式就如同看穿了換行符,所有文本就是一個(gè)長(zhǎng)長(zhǎng)的只有一行的字符串,所以^就是這一行字符串的行
首,$就是這一行的行尾。
多行模式,無法穿透換行符,^和$還是行首行尾的意思,只不過限于每一行
注意:注意字符串中看不見的換行符,\r\n會(huì)影響e$的測(cè)試,e$只能匹配e\n

Python正則表達(dá)式
re模塊
編譯
re.compile(pattern, flags=0)
返回正則表達(dá)式對(duì)象regex
正則表達(dá)式編譯的結(jié)果保存,下次使用同樣的pattern時(shí)不需要重新編譯
單次匹配
regex.match(string[, pos[, endpos]])

從字符串開頭匹配,可指定開始與結(jié)束位置 返回match對(duì)象
regex.search(string[, pos[, endpos]])

從頭搜索直到第一個(gè)匹配,可指定開始與結(jié)束位置 返回match對(duì)象
regex.fullmatch(string[, pos[, endpos]])
整個(gè)字符串與正則表達(dá)式匹配
全文搜索
regex.findall(string[, pos[, endpos]])

對(duì)整個(gè)字符串從左至右匹配,返回所有匹配項(xiàng)的列表
regex.finditer(string[, pos[, endpos]])
對(duì)整個(gè)字符串,從左至右匹配,返回所有匹配項(xiàng)的迭代器,每項(xiàng)都是match對(duì)象
匹配替換
regex.sub(replacement, string, count=0)

使用pattern對(duì)字符串string進(jìn)行匹配,對(duì)匹配項(xiàng)用replacement替換
replacement可以是string、bytes、function
regex.subn(replacement, string, count=0)
功能類似sub 返回一個(gè)元組 (new_string, number_of_subs_made)
分割字符串
regex.split(string, maxsplit=0)
返回列表
分組
使用(pattern)捕獲的數(shù)據(jù)放到組中

match類方法
group(N)

1-N時(shí)對(duì)應(yīng)的分組 0但會(huì)整個(gè)匹配的字符串
如果使用了命名分組,可用group(name)方式取出
groups()

返回所有組的一個(gè)元組
groupdict()
返回所有命名分組的字典

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI