做自(zì)由與創造的先行者

Types: 9. File Objects

Python開(kāi)發手冊

9. File Objects

文(wén)件對(duì)象使用(yòng)C的stdio包來(lái)實現(xiàn),并且可以使用(yòng)内置open()函數來(lái)創建。文(wén)件對(duì)象也(yě)由其他(tā)一些(xiē)内置函數和(hé)方法返回,比如os.popen()和(hé)os.fdopen()和(hé)makefile()套接字對(duì)象的方法。可以使用(yòng)該tempfile模塊創建臨時(shí)文(wén)件,并且可以使用(yòng)shutil模塊實現(xiàn)高(gāo)級文(wén)件操作(zuò),例如複制,移動和(hé)删除文(wén)件和(hé)目錄。

當文(wén)件操作(zuò)由于I / O相關原因而失敗時(shí),IOError會(huì)引發異常。這(zhè)包括由于某些(xiē)原因未定義操作(zuò)的情況,例如seek()在tty設備上(shàng)或寫入打開(kāi)以供閱讀的文(wén)件。

文(wén)件有以下(xià)方法:

file.close()

關閉文(wén)件。已關閉的文(wén)件不能(néng)再被讀取或寫入。任何要求文(wén)件打開(kāi)的操作(zuò)将ValueError在文(wén)件關閉後生成一個文(wén)件。close()允許多次呼叫。

從(cóng)Python 2.5開(kāi)始,如果使用(yòng)with語句,則可以避免必須顯式調用(yòng)此方法。例如,下(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,

複制

在舊版本的Python中,您需要這(zhè)樣做才能(néng)獲得相同的效果:

f = open("hello.txt")

try:

for line in f:

print line,

finally:

f.close()

複制

注釋

并非所有Python中的“類文(wén)件”類型都支持用(yòng)作(zuò)with語句的上(shàng)下(xià)文(wén)管理(lǐ)器。如果您的代碼旨在用(yòng)于任何類似文(wén)件的對(duì)象,則可以使用(yòng)該函數contextlib.closing()而不是直接使用(yòng)該對(duì)象。

file.flush()

沖洗内部緩沖區(qū),如stdio's fflush()。這(zhè)可能(néng)對(duì)某些(xiē)類似文(wén)件的對(duì)象沒有作(zuò)用(yòng)。

注釋

flush()不一定會(huì)将文(wén)件的數據寫入磁盤。使用(yòng)flush()後面的os.fsync()來(lái)确保這(zhè)種行爲。

file.fileno()

返回底層實現(xiàn)使用(yòng)的整數“文(wén)件描述符”,以從(cóng)操作(zuò)系統請(qǐng)求I / O操作(zuò)。這(zhè)對(duì)于使用(yòng)文(wén)件描述符的其他(tā)較低(dī)級别的接口(如fcntl模塊或os.read()和(hé)朋友)可能(néng)很(hěn)有用(yòng)。

注釋

類文(wén)件不具有真正的文(wén)件描述符應該對(duì)象不提供這(zhè)個方法!

file.isatty()

返回True如果文(wén)件被連接到(dào)一個tty(樣)的裝置,别的False。

注釋

如果一個類文(wén)件對(duì)象是不是一個真正的文(wén)件相關聯,這(zhè)種方法應該不被執行。

file.next()

一個文(wén)件對(duì)象是它自(zì)己的叠代器,例如iter(f)返回f(除非f關閉)。當一個文(wén)件被用(yòng)作(zuò)叠代器時(shí),通常在一個for循環中(例如,for line in f: print line.strip()),該next()方法被重複調用(yòng)。此方法返回下(xià)一個輸入行,或者StopIteration在文(wén)件打開(kāi)時(shí)讀取EOF時(shí)觸發EOF(當文(wén)件打開(kāi)時(shí),行爲未定義)。爲了(le)使for循環成爲循環遍曆文(wén)件行的最有效方式(非常常見的操作(zuò)),該next()方法使用(yòng)隐藏的預讀緩沖區(qū)。由于使用(yòng)預讀緩沖區(qū),結合next()其他(tā)文(wén)件方法(如readline())不能(néng)正常工(gōng)作(zuò)。但(dàn)是,使用(yòng)seek() 将文(wén)件重新定位到(dào)絕對(duì)位置将刷新預讀緩沖區(qū)。

2.3版本的新功能(néng)。

file.read([size])

從(cóng)文(wén)件中讀取大(dà)小(xiǎo)最大(dà)的字節(如果在讀取大(dà)小(xiǎo)字節之前讀取命中EOF,則讀取次數更少)。如果size參數爲負值或省略,請(qǐng)讀取所有數據,直到(dào)達到(dào)EOF。字節以字符串對(duì)象的形式返回。立即遇到(dào)EOF時(shí)返回空(kōng)字符串。(對(duì)于某些(xiē)文(wén)件,如ttys,在EOF命中後繼續讀取是有意義的。)請(qǐng)注意,此方法可能(néng)會(huì)fread()多次調用(yòng)基礎C函數以努力獲取盡可能(néng)接近大(dà)小(xiǎo)的字節。還要注意的是,當處于非阻塞模式時(shí),即使沒有給出大(dà)小(xiǎo)參數,也(yě)可能(néng)返回比請(qǐng)求的數據更少的數據。

注釋

這(zhè)個函數隻是底層fread()C函數的一個包裝,并且在角落情況下(xià)表現(xiàn)得相同,比如EOF值是否被緩存。

file.readline([size])

從(cóng)文(wén)件中讀取整行。尾随的換行符保存在字符串中(但(dàn)當文(wén)件以不完整的行結尾時(shí)可能(néng)不存在)。[6]如果size參數存在且非負數,則它是最大(dà)字節數(包括尾随換行符),并且可能(néng)返回不完整的行。當size不是0時(shí),僅當立即遇到(dào)EOF 時(shí)才返回空(kōng)字符串。

注釋

與stdio不同的是fgets(),如果返回的字符串'\0'出現(xiàn)在輸入中,則返回的字符串包含空(kōng)字符()。

file.readlines([sizehint])

閱讀直到(dào)使用(yòng)EOF,readline()并返回包含這(zhè)樣讀取的行的列表。如果存在可選的sizehint參數,而不是讀取到(dào)EOF,則會(huì)讀取總計(jì)約爲sizehint字節的整行(可能(néng)在四舍五入到(dào)内部緩沖區(qū)大(dà)小(xiǎo)之後)。實現(xiàn)類似文(wén)件的界面的對(duì)象可能(néng)會(huì)選擇忽略sizehint,如果它無法實現(xiàn),或無法有效實施。

file.xreadlines()

此方法返回與之相同的内容iter(f)。

2.1版本中的新功能(néng)。

自(zì)2.3版棄用(yòng):for line in file改爲使用(yòng)。

file.seek(offset[, whence])

設置文(wén)件的當前位置,如stdio's fseek()。的何處參數是可選的,缺省值是os.SEEK_SET或0(絕對(duì)文(wén)件定位); 其他(tā)值是os.SEEK_CUR或1(相對(duì)于當前位置尋找)和(hé)os.SEEK_END或2(相對(duì)于文(wén)件結尾尋找)。沒有返回值。

例如,f.seek(2, os.SEEK_CUR)将位置提前兩位,f.seek(-3, os.SEEK_END)并将位置設置爲倒數第三位。

請(qǐng)注意,如果打開(kāi)文(wén)件以進行追加(模式'a'或'a+'),seek()則在下(xià)次寫入時(shí)将取消所有操作(zuò)。如果文(wén)件僅在追加模式(模式'a')下(xià)打開(kāi)才能(néng)打開(kāi),則此方法本質上(shàng)是無操作(zuò)的,但(dàn)對(duì)于在啓用(yòng)讀取(模式'a+')的附加模式下(xià)打開(kāi)的文(wén)件仍然有用(yòng)。如果文(wén)件以文(wén)本模式打開(kāi)(不帶'b'),則隻有返回的偏移量tell()是合法的。使用(yòng)其他(tā)偏移導緻未定義的行爲。

請(qǐng)注意,并非所有文(wén)件對(duì)象都是可搜索的。

在版本2.6中更改:将浮點值傳遞爲偏移量已被棄用(yòng)。

file.tell()

返回文(wén)件的當前位置,如stdio's ftell()。

注釋

在Windows上(shàng),當讀取具有Unix風(fēng)格的行結尾的文(wén)件時(shí),tell()可以返回非法值(之後fgets())。使用(yòng)二進制模式('rb')來(lái)解決這(zhè)個問題。

file.truncate([size])

截斷文(wén)件的大(dà)小(xiǎo)。如果可選大(dà)小(xiǎo)參數存在,則該文(wén)件被截斷爲(最多)該大(dà)小(xiǎo)。大(dà)小(xiǎo)默認爲當前位置。當前文(wén)件位置不變。請(qǐng)注意,如果指定大(dà)小(xiǎo)超過文(wén)件的當前大(dà)小(xiǎo),則結果将取決于平台:可能(néng)性包括文(wén)件可能(néng)保持不變,增加到(dào)指定的大(dà)小(xiǎo),就像零填充一樣,或者用(yòng)未定義的新内容增加到(dào)指定的大(dà)小(xiǎo)。可用(yòng)性:Windows,許多Unix變體。

file.write(str)

将一個字符串寫入文(wén)件。沒有返回值。由于緩沖,在調用(yòng)flush()or close()方法之前,字符串可能(néng)實際上(shàng)不會(huì)顯示在文(wén)件中。

file.writelines(sequence)

将一串字符串寫入文(wén)件。序列可以是任何可生成字符串的可叠代對(duì)象,通常是字符串列表。沒有返回值。(該名稱旨在匹配readlines(); writelines()不添加行分隔符。)

文(wén)件支持叠代器協議(yì)。每次叠代都會(huì)返回相同的結果readline(),并且當readline()方法返回空(kōng)字符串時(shí)叠代結束。

文(wén)件對(duì)象還提供了(le)許多其他(tā)有趣的屬性。對(duì)于類似文(wén)件的對(duì)象,這(zhè)些(xiē)不是必需的,但(dàn)是如果它們對(duì)于特定對(duì)象有意義的話(huà)應該被實現(xiàn)。

file.closed

bool表示文(wén)件對(duì)象的當前狀态。這(zhè)是隻讀屬性; 該close()方法更改值。它可能(néng)不适用(yòng)于所有類文(wén)件對(duì)象。

file.encoding

該文(wén)件使用(yòng)的編碼。當Unicode字符串寫入文(wén)件時(shí),它們将被轉換爲使用(yòng)此編碼的字節字符串。另外(wài),當文(wén)件連接到(dào)終端時(shí),該屬性給出終端可能(néng)使用(yòng)的編碼(如果用(yòng)戶配置了(le)終端,則該信息可能(néng)不正确)。該屬性是隻讀的,可能(néng)不會(huì)出現(xiàn)在所有類文(wén)件對(duì)象上(shàng)。也(yě)可能(néng)是None,在這(zhè)種情況下(xià),文(wén)件使用(yòng)系統默認編碼來(lái)轉換Unicode字符串。

2.3版本的新功能(néng)。

file.errors

Unicode錯誤處理(lǐ)程序與編碼一起使用(yòng)。

2.6版本中的新功能(néng)。

file.mode

文(wén)件的I / O模式。如果文(wén)件是使用(yòng)open()内置函數創建的,則這(zhè)将是mode參數的值。這(zhè)是一個隻讀屬性,可能(néng)不會(huì)出現(xiàn)在所有類文(wén)件對(duì)象上(shàng)。

file.name

如果文(wén)件對(duì)象是使用(yòng)創建open()的文(wén)件的名稱。否則,一些(xiē)字符串指示表單的文(wén)件對(duì)象的來(lái)源<...>。這(zhè)是一個隻讀屬性,可能(néng)不會(huì)出現(xiàn)在所有類文(wén)件對(duì)象上(shàng)。

file.newlines

如果Python是使用(yòng)通用(yòng)換行符(默認值)構建的,則此隻讀屬性存在,對(duì)于以通用(yòng)換行讀取模式打開(kāi)的文(wén)件,它會(huì)跟蹤讀取文(wén)件時(shí)遇到(dào)的換行符類型。它可以采取的值'\r','\n','\r\n',None(未知(zhī),沒有換行讀還)或包含所有看(kàn)到(dào)的換行符類型,元組,指示中所遇到(dào)的多個換行符約定。對(duì)于未以通用(yòng)換行符讀取模式打開(kāi)的文(wén)件,此屬性的值将爲None。

file.softspace

指示在使用(yòng)print語句時(shí)是否需要在另一個值之前打印空(kōng)格字符的布爾值。試圖模拟文(wén)件對(duì)象的類也(yě)應該有一個可寫softspace屬性,該屬性應該初始化爲零。對(duì)于大(dà)多數在Python中實現(xiàn)的類,這(zhè)将是自(zì)動的(對(duì)于覆蓋屬性訪問的對(duì)象可能(néng)需要注意); 用(yòng)C實現(xiàn)的類型必須提供一個可寫的softspace屬性。

注意

該屬性不用(yòng)于控制print語句,但(dàn)允許執行print以跟蹤其内部狀态。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Types: 10. memoryview type
上(shàng)一篇:Types: 8. Mapping Types — dict