——文件的其他操作——
我們之前提到的,文件讀一遍之后,文件指針的位置就停留在了文件的末尾赏寇,這時(shí)候如果再進(jìn)行讀取文件,會(huì)發(fā)現(xiàn)讀取不到任何的內(nèi)容价认。那么怎么知道文件指針的位置呢嗅定?
①語法:f.tell()
tell()方法返回文件的當(dāng)前位置,即文件指針當(dāng)前位置用踩。
文件在什么也沒操作的時(shí)候渠退,文件指針的位置是0。
我們對(duì)文件讀取一行之后脐彩,文件的指針位置就發(fā)生了變化碎乃,按照字符進(jìn)行計(jì)數(shù)。
在這里如果用f.read()進(jìn)行讀取惠奸,再對(duì)f.read()說明一下:
語法:f.read(size)? ? ? ? ? ?
參數(shù):size?-- 從文件中讀取的字節(jié)數(shù)
read()?方法用于從文件讀取指定的字節(jié)數(shù)梅誓,如果未給定或?yàn)樨?fù)則讀取所有。
那么怎么解決之前所說的問題呢晨川,怎樣讓指針重新回到指定位置呢证九?
②語法:f.seek(offset[, whence])
參數(shù):offset?-- 開始的偏移量删豺,也就是代表需要移動(dòng)偏移的字節(jié)數(shù)
? ? ? ? ? whence:可選共虑,默認(rèn)值為 0。給offset參數(shù)一個(gè)定義呀页,表示要從哪個(gè)位置開始偏移妈拌;0代表從文件開頭開始算起,1代表從當(dāng)前位置開始算起蓬蝶,2代表從文件末尾算起尘分。
比如,我從文件的開頭先開始讀取一行丸氛,然后打印出此時(shí)文件指針的位置培愁,然后我再讓文件指針回到0的位置,再讀取一行缓窜,打印此時(shí)文件指針的位置定续。按道理說谍咆,我讓文件指針回到0的位置之后,我再打印一行應(yīng)該是文件的第一行私股。我們來看一下結(jié)果是不是這樣:
確實(shí)是這樣摹察。如果是回到任意位置,打印一行倡鲸,我們看一下結(jié)果:
③語法:f.encoding? (注意:后面沒有括號(hào))
f.encoding可以知道文件的編碼方式供嚎,一般為“utf-8”。
④語法:f.fileno()
fileno()?方法返回一個(gè)整型的文件描述符(file descriptor FD 整型)峭状,可用于底層操作系統(tǒng)的 I/O 操作克滴。
也就是說fileno()返回的是文件句柄的編號(hào)。
在這里再說明一下“文件句柄”:在文件I/O中优床,要從一個(gè)文件讀取數(shù)據(jù)偿曙,應(yīng)用程序首先要調(diào)用操作系統(tǒng)函數(shù)并傳送文件名,并選一個(gè)到該文件的路徑來打開文件羔巢。該函數(shù)取回一個(gè)順序號(hào)望忆,即文件句柄(file handle),該文件句柄對(duì)于打開的文件是唯一的識(shí)別依據(jù)竿秆。要從文件中讀取一塊數(shù)據(jù)启摄,應(yīng)用程序需要調(diào)用函數(shù)ReadFile,并將文件句柄在內(nèi)存中的地址和要拷貝的字節(jié)數(shù)傳送給操作系統(tǒng)幽钢。當(dāng)完成任務(wù)后歉备,再通過調(diào)用系統(tǒng)函數(shù)來關(guān)閉該文件。
⑤語法:f.flush()
flush是刷新的意思匪燕,當(dāng)我們以寫的模式打開文件的時(shí)候蕾羊,我們?cè)趯懭胍恍袝r(shí),如果此時(shí)突然斷電帽驯,這一行就可能沒有寫進(jìn)硬盤中龟再,因?yàn)槲募谧x寫的時(shí)候有一個(gè)緩存的機(jī)制,斷電的時(shí)候可能內(nèi)容還在內(nèi)存的緩存中尼变,并沒有寫到硬盤里利凑。硬盤的讀寫速度是比內(nèi)存慢的。內(nèi)存是等待寫幾行嫌术,等到內(nèi)存的緩存滿了之后哀澈,再一起寫到硬盤中,這個(gè)內(nèi)存的緩存一般很小度气。
那么我們?cè)趺幢WC我們寫一行割按,這一行就能寫到了硬盤中?
這時(shí)候就用到了強(qiáng)制刷新磷籍。
flush()?方法是用來刷新緩沖區(qū)的适荣,即將緩沖區(qū)中的數(shù)據(jù)立刻寫入文件丙躏,同時(shí)清空緩沖區(qū),不需要是被動(dòng)的等待輸出緩沖區(qū)寫入束凑。
一般情況下晒旅,文件關(guān)閉后會(huì)自動(dòng)刷新緩沖區(qū),但有時(shí)你需要在關(guān)閉前刷新它汪诉,這時(shí)就可以使用 flush() 方法废恋。
我們來實(shí)踐一下:
我們以“w”的方式打開一個(gè)名為“test.text”的文件,并且寫進(jìn)去“星期一”扒寄。
可以看到鱼鼓,名為“test”的text文件中沒用任何內(nèi)容。
用f.flush()強(qiáng)制刷新一下该编。
可以看到迄本,星期一就被寫進(jìn)去了。
我們?cè)俳又鴮憽靶瞧诙薄?/p>
一樣的课竣,“星期二”沒有被寫進(jìn)去嘉赎。
再用f.flush()刷新一下。
“星期二”就被寫進(jìn)去了于樟。
⑥語法:f.truncate()
truncate()?方法用于截?cái)辔募酰绻付丝蛇x參數(shù) size,則表示截?cái)辔募?size 個(gè)字符迂曲。 如果沒有指定 size靶橱,則從當(dāng)前位置起截?cái)啵唤財(cái)嘀?size 后面的所有字符被刪除路捧。
#指定參數(shù)size——截?cái)辔募閟ize個(gè)字符
#不指定參數(shù)size——從當(dāng)前位置起关霸,截?cái)嗪竺嫠械淖址?/p>
#如果文件是“w”模式,則文件指針的位置在開始的地方杰扫,f.truncate()之后队寇,則會(huì)清空所有的內(nèi)容。
#如果文件是“a”模式涉波,文件指針的位置在文件的末尾英上,f.truncate()之后,對(duì)于文件來說啤覆,沒什么變化。
⑦語法:f.close()
close()?方法用于關(guān)閉一個(gè)已打開的文件惭聂。關(guān)閉后的文件不能再進(jìn)行讀寫操作窗声, 否則會(huì)觸發(fā)?ValueError?錯(cuò)誤。 close() 方法允許調(diào)用多次辜纲。當(dāng) file 對(duì)象被引用到操作另外一個(gè)文件時(shí)笨觅,Python 會(huì)自動(dòng)關(guān)閉之前的 file 對(duì)象拦耐。使用 close() 方法關(guān)閉文件是一個(gè)好的習(xí)慣。
⑧語法:f.closed? ? ? ?(注意:沒有括號(hào))
判斷一個(gè)文件是否關(guān)閉见剩。關(guān)閉的話返回True杀糯,沒有關(guān)閉的話返回False。
⑨語法:f.name
f.name是打印文件的文件名苍苞。
(10)語法:f.errors
f.errors是打印文件的報(bào)錯(cuò)級(jí)別固翰。
(11)語法:f.isatty()
isatty()?方法檢測(cè)文件是否連接到一個(gè)終端設(shè)備,如果是返回 True羹呵,否則返回 False骂际。
(12)語法:f.mode
打印文件的模式。
(13)語法:f.readable()
判斷文件是否可讀冈欢。
(14)語法:f.seekable()
判斷文件是否可以使文件指針偏移歉铝。
(15)語法:f.writable()
判斷文件是否可寫。
(16)語法:f.writelines()
writelines()?方法用于向文件中寫入一序列的字符串凑耻。
這一序列字符串可以是由迭代對(duì)象產(chǎn)生的太示,如一個(gè)字符串列表。
換行需要制定換行符 \n香浩。