本系列所記述的是一些基礎(chǔ)知識點(diǎn)中平時(shí)用的比較少的方法。
一、文件的打開模式
x:,獨(dú)占模式,相當(dāng)于w的進(jìn)階模式,在寫入文件已存在時(shí)會觸發(fā) FileExistsError 異常。
a:,附加模式,可以在文件末尾繼續(xù)寫入。
+:可以與其他模式聯(lián)合使用,r+和w+有個(gè)重要區(qū)別,既w+會將原有文件刪除然后從頭開始寫入,r+不會這樣做。
rb:用于讀取非文本的二進(jìn)制數(shù)據(jù),禁用文本相關(guān)功能。
注:1.為保證兼容性, 寫入文件時(shí)最好用系統(tǒng)默認(rèn)換行符os.linesep代替“\n"等字符。
? 2.readlines默認(rèn)識別所有的合法換行符( '\n' 、 '\r' 和 '\r\n' ),但如將關(guān)鍵字參數(shù) newline 設(shè)置為空字符串,如 open(name, newline=''),將會禁止換行;newline也可以任意指定換行符,這樣readlines時(shí)就不會對其他換行符進(jìn)行識別換行,但是在寫入時(shí)會自動將其他換行符替換為指定的換行符。
二、文件的內(nèi)容定位
使用seek方法可以更改文件開始執(zhí)行位置,函數(shù)原型如下:
f.seek(offset, whence)
offset為偏移量的字節(jié)數(shù),可以為負(fù)數(shù);
whence是偏移的參照標(biāo)準(zhǔn):io.SEEK_SET(0)表示相對文件開頭,io.SEEK_SET(1)表示相對文件當(dāng)前位置,io.SEEK_SET(2)表示相對文件末尾。
三、文件的實(shí)時(shí)更新
python通常是先將數(shù)據(jù)寫入緩存,在文件關(guān)閉時(shí)將其保存到文件。
有時(shí)會遇到這樣的情況:在程序運(yùn)行過程中持續(xù)向文件輸出,但是如果程序遇到問題突然崩潰,文件沒有正常關(guān)閉,可能很多內(nèi)容不會被寫入到文件中,這種情況下可以考慮使用flush方法重置緩存(更新文件內(nèi)容)。
需要注意的是,根據(jù)使用的操作系統(tǒng)和設(shè)置, flush可能出于鎖定考慮而禁止其他正在運(yùn)行的程序訪問這個(gè)文件。
四、文件的讀寫操作
read:讀取整個(gè)文本;
readline:每次讀取一行;
readlines:讀取整個(gè)文本,返回的是一個(gè)列表,每行的內(nèi)容作為一個(gè)元素(包括換行符)。
寫入操作與讀取操作相對應(yīng)。
五、文件的迭代
文件實(shí)際上是可迭代的,這意味著可在 for 循環(huán)中直接使用它們來迭代行,例如:
>>> lines = list(open('somefile.txt'))
>>> lines
['First line\n', 'Second line\n', 'Third and final line\n']
也就是說,文件讀入后事實(shí)上是按行分割的可迭代對象。
六、fileinput模塊
一個(gè)python的內(nèi)置模塊,以前還真沒用過,其基本功能是逐行讀入一個(gè)(或多個(gè)文件),主要方法如下:
- input([files[, inplace[, backup]]]) 幫助迭代多個(gè)輸入流中的行;
- filename() 返回當(dāng)前文件的名稱;
- lineno() 返回(累計(jì)的)當(dāng)前行號;
- filelineno() 返回在當(dāng)前文件中的行號;
- isfirstline() 檢查當(dāng)前行是否是文件中的第一行;
- isstdin() 檢查最后一行是否來自 sys.stdin;
- nextfile() 關(guān)閉當(dāng)前文件并移到下一個(gè)文件;
- close() 關(guān)閉序列。
fileinput.input()方法既支持直接給定文件參數(shù),也支持在shell等控制臺中以參數(shù)的形式指定文件。
在實(shí)際應(yīng)用中,fileinput.input()只讀取它實(shí)際需要讀取的文本部分,因此在文件較大的時(shí)候,可以用來實(shí)現(xiàn)延遲行迭代。例如:
import fileinput
for line in fileinput.input(filename):
process(line)
七、os模塊
os是一個(gè)操作系統(tǒng)服務(wù)模塊,寫在這里是因?yàn)槠渥幽Kos.path中包含了很多有關(guān)文件路徑的操作;另外os模塊本身也有很多與路徑目錄相關(guān)的操作。
- os.sep:路徑分隔符,例如windows中的“\”;
- os.pathsep:分割不同路徑的分隔符,windows下為“;”,linux下為“:”;
- os.linesep:文本文件中的換行符(盡量用這個(gè)屬性代替具體的換行符);
- os.path.split:返回給定路徑的父目錄和當(dāng)前目錄的相對名稱,返回值是列表;
- os.path.join:使用系統(tǒng)默認(rèn)的分隔符連接路徑。