9. File Objects
文件對象使用C的stdio包來實現,并且可(kě)以使用內(nèi)置open()函數(shù)來創建。文件對象也由其他(tā)一(yī)些內(nèi)置函數(shù)和(hé)方法返回,比如(rú)os.popen()和(hé)os.fdopen()和(hé)makefile()套接字對象的方法。可(kě)以使用該tempfile模塊創建臨時(shí)文件,并且可(kě)以使用shutil模塊實現高級文件操作(zuò),例如(rú)複制,移動和(hé)删除文件和(hé)目錄。
當文件操作(zuò)由于I / O相關原因而失敗時(shí),IOError會引發異常。這(zhè)包括由于某些原因未定義操作(zuò)的情況,例如(rú)seek()在tty設備上(shàng)或寫入打開(kāi)以供閱讀的文件。
文件有以下(xià)方法:
file.close()
關閉文件。已關閉的文件不能(néng)再被讀取或寫入。任何要(yào)求文件打開(kāi)的操作(zuò)将ValueError在文件關閉後生成一(yī)個文件。close()允許多次呼叫。
從(cóng)Python 2.5開(kāi)始,如(rú)果使用with語句,則可(kě)以避免必須顯式調用此方法。例如(rú),下(xià)面的代碼将在退出塊時(shí)自(zì)動關閉fwith:
from __future__ import with_statement # This isn't required in Python 2.6
with open("hello.txt") as f:
for line in f:
print line,
複制
在舊(jiù)版本的Python中,您需要(yào)這(zhè)樣做(zuò)才能(néng)獲得相同的效果:
f = open("hello.txt")
try:
for line in f:
print line,
finally:
f.close()
複制
注釋
并非所有Python中的“類文件”類型都(dōu)支持用作(zuò)with語句的上(shàng)下(xià)文管理器。如(rú)果您的代碼旨在用于任何類似文件的對象,則可(kě)以使用該函數(shù)contextlib.closing()而不是直接使用該對象。
file.flush()
沖洗內(nèi)部緩沖區(qū),如(rú)stdio's fflush()。這(zhè)可(kě)能(néng)對某些類似文件的對象沒有作(zuò)用。
注釋
flush()不一(yī)定會将文件的數(shù)據寫入磁盤。使用flush()後面的os.fsync()來确保這(zhè)種行(xíng)為(wèi)。
file.fileno()
返回底層實現使用的整數(shù)“文件描述符”,以從(cóng)操作(zuò)系統請(qǐng)求I / O操作(zuò)。這(zhè)對于使用文件描述符的其他(tā)較低(dī)級别的接口(如(rú)fcntl模塊或os.read()和(hé)朋(péng)友(yǒu))可(kě)能(néng)很(hěn)有用。
注釋
類文件不具有真正的文件描述符應該對象不提供這(zhè)個方法!
file.isatty()
返回True如(rú)果文件被連接到一(yī)個tty(樣)的裝置,别的False。
注釋
如(rú)果一(yī)個類文件對象是不是一(yī)個真正的文件相關聯,這(zhè)種方法應該不被執行(xíng)。
file.next()
一(yī)個文件對象是它自(zì)己的叠代器,例如(rú)iter(f)返回f(除非f關閉)。當一(yī)個文件被用作(zuò)叠代器時(shí),通(tōng)常在一(yī)個for循環中(例如(rú),for line in f: print line.strip()),該next()方法被重複調用。此方法返回下(xià)一(yī)個輸入行(xíng),或者StopIteration在文件打開(kāi)時(shí)讀取EOF時(shí)觸發EOF(當文件打開(kāi)時(shí),行(xíng)為(wèi)未定義)。為(wèi)了(le)使for循環成為(wèi)循環遍曆文件行(xíng)的最有效方式(非常常見(jiàn)的操作(zuò)),該next()方法使用隐藏的預讀緩沖區(qū)。由于使用預讀緩沖區(qū),結合next()其他(tā)文件方法(如(rú)readline())不能(néng)正常工(gōng)作(zuò)。但(dàn)是,使用seek() 将文件重新定位到絕對位置将刷新預讀緩沖區(qū)。
2.3版本的新功能(néng)。
file.read([size])
從(cóng)文件中讀取大小最大的字節(如(rú)果在讀取大小字節之前讀取命中EOF,則讀取次數(shù)更少(shǎo))。如(rú)果size參數(shù)為(wèi)負值或省略,請(qǐng)讀取所有數(shù)據,直到達到EOF。字節以字符串對象的形式返回。立即遇到EOF時(shí)返回空字符串。(對于某些文件,如(rú)ttys,在EOF命中後繼續讀取是有意義的。)請(qǐng)注意,此方法可(kě)能(néng)會fread()多次調用基礎C函數(shù)以努力獲取盡可(kě)能(néng)接近大小的字節。還要(yào)注意的是,當處于非阻塞模式時(shí),即使沒有給出大小參數(shù),也可(kě)能(néng)返回比請(qǐng)求的數(shù)據更少(shǎo)的數(shù)據。
注釋
這(zhè)個函數(shù)隻是底層fread()C函數(shù)的一(yī)個包裝,并且在角落情況下(xià)表現得相同,比如(rú)EOF值是否被緩存。
file.readline([size])
從(cóng)文件中讀取整行(xíng)。尾随的換行(xíng)符保存在字符串中(但(dàn)當文件以不完整的行(xíng)結尾時(shí)可(kě)能(néng)不存在)。[6]如(rú)果size參數(shù)存在且非負數(shù),則它是最大字節數(shù)(包括尾随換行(xíng)符),并且可(kě)能(néng)返回不完整的行(xíng)。當size不是0時(shí),僅當立即遇到EOF 時(shí)才返回空字符串。
注釋
與stdio不同的是fgets(),如(rú)果返回的字符串'\0'出現在輸入中,則返回的字符串包含空字符()。
file.readlines([sizehint])
閱讀直到使用EOF,readline()并返回包含這(zhè)樣讀取的行(xíng)的列表。如(rú)果存在可(kě)選的sizehint參數(shù),而不是讀取到EOF,則會讀取總計約為(wèi)sizehint字節的整行(xíng)(可(kě)能(néng)在四舍五入到內(nèi)部緩沖區(qū)大小之後)。實現類似文件的界面的對象可(kě)能(néng)會選擇忽略sizehint,如(rú)果它無法實現,或無法有效實施。
file.xreadlines()
此方法返回與之相同的內(nèi)容iter(f)。
2.1版本中的新功能(néng)。
自(zì)2.3版棄用:for line in file改為(wèi)使用。
file.seek(offset[, whence])
設置文件的當前位置,如(rú)stdio's fseek()。的何處參數(shù)是可(kě)選的,缺省值是os.SEEK_SET或0(絕對文件定位); 其他(tā)值是os.SEEK_CUR或1(相對于當前位置尋找)和(hé)os.SEEK_END或2(相對于文件結尾尋找)。沒有返回值。
例如(rú),f.seek(2, os.SEEK_CUR)将位置提前兩位,f.seek(-3, os.SEEK_END)并将位置設置為(wèi)倒數(shù)第三位。
請(qǐng)注意,如(rú)果打開(kāi)文件以進行(xíng)追加(模式'a'或'a+'),seek()則在下(xià)次寫入時(shí)将取消所有操作(zuò)。如(rú)果文件僅在追加模式(模式'a')下(xià)打開(kāi)才能(néng)打開(kāi),則此方法本質上(shàng)是無操作(zuò)的,但(dàn)對于在啓用讀取(模式'a+')的附加模式下(xià)打開(kāi)的文件仍然有用。如(rú)果文件以文本模式打開(kāi)(不帶'b'),則隻有返回的偏移量tell()是合法的。使用其他(tā)偏移導緻未定義的行(xíng)為(wèi)。
請(qǐng)注意,并非所有文件對象都(dōu)是可(kě)搜索的。
在版本2.6中更改:将浮點值傳遞為(wèi)偏移量已被棄用。
file.tell()
返回文件的當前位置,如(rú)stdio's ftell()。
注釋
在Windows上(shàng),當讀取具有Unix風(fēng)格的行(xíng)結尾的文件時(shí),tell()可(kě)以返回非法值(之後fgets())。使用二進制模式('rb')來解決這(zhè)個問(wèn)題。
file.truncate([size])
截斷文件的大小。如(rú)果可(kě)選大小參數(shù)存在,則該文件被截斷為(wèi)(最多)該大小。大小默認為(wèi)當前位置。當前文件位置不變。請(qǐng)注意,如(rú)果指定大小超過文件的當前大小,則結果将取決于平台:可(kě)能(néng)性包括文件可(kě)能(néng)保持不變,增加到指定的大小,就像零填充一(yī)樣,或者用未定義的新內(nèi)容增加到指定的大小。可(kě)用性:Windows,許多Unix變體。
file.write(str)
将一(yī)個字符串寫入文件。沒有返回值。由于緩沖,在調用flush()or close()方法之前,字符串可(kě)能(néng)實際上(shàng)不會顯示在文件中。
file.writelines(sequence)
将一(yī)串字符串寫入文件。序列可(kě)以是任何可(kě)生成字符串的可(kě)叠代對象,通(tōng)常是字符串列表。沒有返回值。(該名稱旨在匹配readlines(); writelines()不添加行(xíng)分隔符。)
文件支持叠代器協議(yì)。每次叠代都(dōu)會返回相同的結果readline(),并且當readline()方法返回空字符串時(shí)叠代結束。
文件對象還提供了(le)許多其他(tā)有趣的屬性。對于類似文件的對象,這(zhè)些不是必需的,但(dàn)是如(rú)果它們對于特定對象有意義的話應該被實現。
file.closed
bool表示文件對象的當前狀态。這(zhè)是隻讀屬性; 該close()方法更改值。它可(kě)能(néng)不适用于所有類文件對象。
file.encoding
該文件使用的編碼。當Unicode字符串寫入文件時(shí),它們将被轉換為(wèi)使用此編碼的字節字符串。另外(wài),當文件連接到終端時(shí),該屬性給出終端可(kě)能(néng)使用的編碼(如(rú)果用戶配置了(le)終端,則該信息可(kě)能(néng)不正确)。該屬性是隻讀的,可(kě)能(néng)不會出現在所有類文件對象上(shàng)。也可(kě)能(néng)是None,在這(zhè)種情況下(xià),文件使用系統默認編碼來轉換Unicode字符串。
2.3版本的新功能(néng)。
file.errors
Unicode錯誤處理程序與編碼一(yī)起使用。
2.6版本中的新功能(néng)。
file.mode
文件的I / O模式。如(rú)果文件是使用open()內(nèi)置函數(shù)創建的,則這(zhè)将是mode參數(shù)的值。這(zhè)是一(yī)個隻讀屬性,可(kě)能(néng)不會出現在所有類文件對象上(shàng)。
file.name
如(rú)果文件對象是使用創建open()的文件的名稱。否則,一(yī)些字符串指示表單的文件對象的來源<...>。這(zhè)是一(yī)個隻讀屬性,可(kě)能(néng)不會出現在所有類文件對象上(shàng)。
file.newlines
如(rú)果Python是使用通(tōng)用換行(xíng)符(默認值)構建的,則此隻讀屬性存在,對于以通(tōng)用換行(xíng)讀取模式打開(kāi)的文件,它會跟蹤讀取文件時(shí)遇到的換行(xíng)符類型。它可(kě)以采取的值'\r','\n','\r\n',None(未知,沒有換行(xíng)讀還)或包含所有看(kàn)到的換行(xíng)符類型,元組,指示中所遇到的多個換行(xíng)符約定。對于未以通(tōng)用換行(xíng)符讀取模式打開(kāi)的文件,此屬性的值将為(wèi)None。
file.softspace
指示在使用print語句時(shí)是否需要(yào)在另一(yī)個值之前打印空格字符的布爾值。試圖模拟文件對象的類也應該有一(yī)個可(kě)寫softspace屬性,該屬性應該初始化為(wèi)零。對于大多數(shù)在Python中實現的類,這(zhè)将是自(zì)動的(對于覆蓋屬性訪問(wèn)的對象可(kě)能(néng)需要(yào)注意); 用C實現的類型必須提供一(yī)個可(kě)寫的softspace屬性。
注意
該屬性不用于控制print語句,但(dàn)允許執行(xíng)print以跟蹤其內(nèi)部狀态。
網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發