一.文件IO常用操作
方法 | 含義 |
---|---|
open | 打開 |
read | 讀取 |
write | 寫入 |
close | 關(guān)閉 |
readline | 單行讀取 |
readlines | 多行讀取 |
seek | 文件指針操作 |
tell | 讀取當(dāng)前指針位置 |
二.open
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
創(chuàng)建并打開一個文件test,然后關(guān)閉
打開一個文件,返回一個文件對象(流對象)和文件描述符掂摔。
打開文件失敗,則返回異常姑蓝。
#touch test #linux
#New-Item "new test.txt" -type File #powershell
f = open("test") # file對象
# windows <_io.TextIOWrapper name='test' mode='r' encoding='cp936'> # linux <_io.TextIOWrapper name='test' mode='r' encoding='UTF-8'> print(f.read()) # 讀取文件
f.close() # 關(guān)閉文件
1.open參數(shù)詳解
① file
打開或者要創(chuàng)建的文件名,如果不指定路徑维贺,默認是當(dāng)前路徑
或者是文件描述符(整型)
② mode
文件打開的模式它掂。默認以文本只讀 mode=rt
的模式打開已經(jīng)存在的文件
描述字符 | 含義 |
---|---|
r | 缺省值巴帮,只讀打開溯泣,如果文件不存在,則拋出錯誤FileNotFoundError異常 |
w | 只寫打開榕茧,沒有文件則創(chuàng)建文件垃沦,如果文件存在,清空文件 |
x | 創(chuàng)建文件用押,并只寫方式打開肢簿,文件存在則報錯 |
a | 寫入打開,如果文件存在,則追加文件內(nèi)容池充,不存在則先創(chuàng)建再追加 |
b | 二進制模式桩引,文件按照字節(jié)理解,字節(jié)操作使用bytes類型 |
t | 缺省值收夸,文本模式坑匠,將文件按照某種字符標碼理解,按照字符操作 |
+ | 不能單獨使用卧惜,讀寫打開一個文件厘灼。給原來只讀,只寫當(dāng)時打開提供缺失的讀或者寫功能 |
文件指針
文件指針咽瓷,指向當(dāng)前字節(jié)位置
f.seek(offset, whence=0, /) (f 是文件對象)
改變文件流的位置
offset 相對于whence偏移了多少個字節(jié)
whence 可以有三個選擇的值
- 0 -- start of stream (the default); offset should be zero or positive 文件開頭设凹,默認
- 1 -- current stream position; offset may be negative 當(dāng)前位置
- 2 -- end of stream; offset is usually negative 文件末尾
文本模式模式下:支持從開頭向后偏移的。whence=1 表示從當(dāng)前位置開始偏移茅姜,但是offset 只能為0闪朱,相當(dāng)于原地不動。whence=2 表示從文本末尾開始偏移匈睁,offset 只能為0监透,seek 是按照字節(jié)偏移的
二進制模式下:默認whence=0,從文件開頭開始航唆,offset只能是正整數(shù)胀蛮。whence=1,offset可正可負糯钙。whence=2粪狼,offset可正可負。二進制模式支持任意起點的偏移任岸,向后seek可以超界再榄,但是向前的seek不可以超界,否則拋出異常享潜。
調(diào)用seek 會自動flush
2.buffering : 緩沖區(qū)
buffer緩沖區(qū)
緩沖區(qū)是一個內(nèi)存空間困鸥,一般來說是一個FIFO隊列,到緩沖區(qū)滿了或者達到閾值的時候剑按,數(shù)據(jù)才會flush 到磁盤中疾就。
flush() 將緩沖區(qū)數(shù)據(jù)寫入磁盤close()關(guān)閉前會調(diào)用flush()
buffering | 說明 |
---|---|
buffering=-1 | t,b都是默認使用io.DEFAULT_BUFFER_SIZE 的值,默認是4096或者8192艺蝴。 |
buffering=0 | b 關(guān)閉緩沖區(qū) 猬腰,t 不支持 |
buffering=1 | b 就1個字節(jié),t 行緩沖猜敢,遇到換行符才flush |
buffering> 1 | b模式表示緩沖的大小姑荷,t模式盒延,還是使用默認的buffer_size |
3.encoding
None 表示使用缺省編碼,依賴操作系統(tǒng)鼠冕。
windows默認是GBK(cp936)添寺。
linux默認是UTF-8。
4.其他參數(shù)
errors 編碼錯誤將被捕獲懈费,None和strict表示有編碼錯誤將拋出ValueError錯誤畦贸,ignore表示忽略。
newline文本模式中楞捂,換行的轉(zhuǎn)換薄坏。
以為None、'' 空串寨闹、'\r'胶坠、'\n'、'\r\n' 讀時繁堡,None表示'\r'沈善、'\n'、'\r\n'都被 轉(zhuǎn)換為'\n';''表示不會自動轉(zhuǎn)換通用換行符;其它合法字符表示換行符就是指定字符椭蹄,就會按照指定字符分行 寫 時闻牡,None表示'\n'都會被替換為系統(tǒng)缺省行分隔符os.linesep;'\n'或''表示'\n'不替換;其它合法字符表示'\n'會被 替換為指定的字符。
closefd 關(guān)閉文件描述符绳矩,True表示關(guān)閉它罩润。False會在文件關(guān)閉后保持這個描述符。fileobj.fileno()查看
三.read
fileobj.read(size=-1, /)
size表示讀取的多少個字符或字節(jié);負數(shù)或者None表示讀取到EOF
- readline(size=-1)
一行行讀取文件內(nèi)容翼馆。size設(shè)置一次能讀取行內(nèi)幾個字符或字節(jié)割以。 - readlines(hint=-1)
讀取所有行的列表。指定hint則返回指定的行數(shù)
四.write
fileobj.write(s, /)
把字符串s寫入到文件中并返回字符的個數(shù)应媚。
writelines(lines)严沥,將字符串列表寫入文件。
五.close
flush 并關(guān)閉文件對象中姜。
文件已經(jīng)關(guān)閉消玄,再次關(guān)閉沒有任何 效果
六. 上下文管理
交給python解釋器去釋放文件對象
with open("file") as f:
f.read()
或者以下這種寫法
f = open('test')
with f:
f.read()
- 使用with .. as 關(guān)鍵字
- 上下文管理的語句塊并不會開啟新的作用域
- with語句塊執(zhí)行完畢,會自動關(guān)閉文件對象
對于類似于文件對象的IO對象丢胚,一般來說都需要在不使用的時候關(guān)閉翩瓜、注銷,以釋放資源嗜桌。 IO被打開的時候奥溺,會獲得一個文件描述符辞色。計算機資源是有限的骨宠,所以操作系統(tǒng)都會做限制浮定。就是為了保護計算機 的資源不要被完全耗盡,計算資源是共享的层亿,不是獨占的桦卒。 一般情況下,除非特別明確的知道資源情況匿又,否則不要提高資源的限制值來解決問題方灾。