當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python open用法及代碼示例


用法:

open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打開file 並返回相應的文件對象。如果無法打開文件,則會引發 OSError。有關如何使用此函數的更多示例,請參閱讀取和寫入文件。

file 是一個 path-like 對象,它給出要打開的文件的路徑名(絕對或相對於當前工作目錄)或要包裝的文件的整數文件說明符。 (如果給定文件說明符,則在關閉返回的 I/O 對象時將其關閉,除非 closefd 設置為 False 。)

mode 是一個可選字符串,用於指定打開文件的模式。它默認為'r',這意味著以文本模式打開以供閱讀。其他常見的值是用於寫入的'w'(如果文件已經存在則截斷文件)、用於獨占創建的'x'和用於追加的'a'(在some Unix 係統上,意味著all 寫入追加到無論當前的查找位置如何,文件的結尾)。在文本模式下,如果未指定encoding,則使用的編碼取決於平台:調用locale.getpreferredencoding(False) 以獲取當前的語言環境編碼。 (對於讀取和寫入原始字節,請使用二進製模式並保持 encoding 未指定。)可用的模式是:

特點

意義

'r'

打開閱讀(默認)

'w'

打開寫入,首先截斷文件

'x'

打開以獨占創建,如果文件已存在則失敗

'a'

打開寫入,如果存在則附加到文件末尾

'b'

二進製模式

't'

文本模式(默認)

'+'

開放更新(讀寫)

默認模式是'r'(打開閱讀文本,'rt' 的同義詞)。 'w+''w+b' 模式打開並截斷文件。 'r+''r+b' 模式打開文件時不進行截斷。

如概述中所述,Python 區分二進製和文本 I/O。以二進製模式打開的文件(包括mode 參數中的'b')將內容作為bytes 對象返回,無需任何解碼。在文本模式下(默認情況下,或者當 't' 包含在 mode 參數中時),文件的內容以 str 的形式返回,這些字節首先使用平台相關的編碼或使用指定的解碼encoding 如果給定。

允許使用額外的模式字符 'U' ,它不再有任何效果,並且被視為已棄用。它之前在文本模式下啟用了通用換行符,這成為 Python 3.0 中的默認行為。有關更多詳細信息,請參閱換行參數的文檔。

注意

Python 不依賴於底層操作係統的文本文件概念;所有的處理都是由 Python 自己完成的,因此與平台無關。

buffering 是用於設置緩衝策略的可選整數。傳遞 0 以關閉緩衝(僅在二進製模式下允許),1 以選擇行緩衝(僅在文本模式下可用),以及整數 > 1 以指示固定大小的塊緩衝區的大小(以字節為單位)。當沒有給出 buffering 參數時,默認緩衝策略的工作方式如下:

  • 二進製文件以固定大小的塊緩衝;緩衝區的大小是通過嘗試確定底層設備的 “block size” 並退回到 io.DEFAULT_BUFFER_SIZE 的啟發式方法來選擇的。在許多係統上,緩衝區通常為 4096 或 8192 字節長。
  • “Interactive” 文本文件(isatty() 返回 True 的文件)使用行緩衝。其他文本文件使用上述二進製文件的策略。

encoding 是用於對文件進行解碼或編碼的編碼名稱。這應該隻在文本模式下使用。默認編碼取決於平台(無論locale.getpreferredencoding() 返回什麽),但可以使用 Python 支持的任何文本編碼。有關支持的編碼列表,請參閱codecs 模塊。

errors 是一個可選字符串,它指定如何處理編碼和解碼錯誤——這不能用於二進製模式。有多種標準錯誤處理程序可用(在錯誤處理程序下列出),但已使用 codecs.register_error() 注冊的任何錯誤處理名稱也是有效的。標準名稱包括:

  • 'strict' 如果存在編碼錯誤,則引發 ValueError 異常。 None 的默認值具有相同的效果。
  • 'ignore' 忽略錯誤。請注意,忽略編碼錯誤可能會導致數據丟失。
  • 'replace' 導致在存在格式錯誤的數據的位置插入替換標記(例如 '?' )。
  • 'surrogateescape' 將任何不正確的字節表示為從 U+DC80 到 U+DCFF 的低代理代碼單元。當寫入數據時使用surrogateescape 錯誤處理程序時,這些代理代碼單元將被轉回相同的字節。這對於處理未知編碼的文件很有用。
  • 'xmlcharrefreplace' 僅在寫入文件時受支持。編碼不支持的字符將替換為相應的 XML 字符引用 &#nnn;
  • 'backslashreplace' 用 Python 的反斜杠轉義序列替換格式錯誤的數據。
  • 'namereplace'(也僅在寫入時支持)將不支持的字符替換為 \N{...} 轉義序列。

newline控製方式通用換行符模式有效(它僅適用於文本模式)。有可能None,'','\n','\r', 和'\r\n'.它的工作原理如下:

  • 從流中讀取輸入時,如果 newlineNone ,則啟用通用換行模式。輸入中的行可以以 '\n''\r''\r\n' 結尾,這些行在返回給調用者之前會被翻譯成 '\n'。如果是 '' ,則啟用通用換行符模式,但行尾會返回給調用者,但未翻譯。如果它具有任何其他合法值,則輸入行僅由給定字符串終止,並且行結束符未翻譯地返回給調用者。
  • 將輸出寫入流時,如果 newlineNone ,則寫入的任何 '\n' 字符都將轉換為係統默認行分隔符 os.linesep 。如果 newline'''\n' ,則不進行翻譯。如果 newline 是任何其他合法值,則寫入的任何 '\n' 字符都將轉換為給定字符串。

如果 closefdFalse 並且給出了文件說明符而不是文件名,則當文件關閉時,底層文件說明符將保持打開狀態。如果給定文件名 closefd 必須是 True (默認);否則,將引發錯誤。

可以通過將可調用對象傳遞為 opener 來使用自定義開啟器。然後通過使用(fileflags)調用opener來獲取文件對象的底層文件說明符。 opener 必須返回一個打開的文件說明符(傳遞 os.open 作為 opener 會產生類似於傳遞 None 的函數)。

新創建的文件是不可繼承的。

以下示例使用 os.open() 函數的 dir_fd 參數打開相對於給定目錄的文件:

>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
...     print('This will be written to somedir/spamspam.txt', file=f)
...
>>> os.close(dir_fd)  # don't leak a file descriptor

open() 函數返回的文件對象類型取決於模式。當 open() 用於以文本模式('w''r''wt''rt' 等)打開文件時,它返回 io.TextIOBase 的子類(特別是 io.TextIOWrapper)。當用於以帶緩衝的二進製模式打開文件時,返回的類是 io.BufferedIOBase 的子類。確切的類有所不同:在讀取二進製模式下,它返回一個 io.BufferedReader ;在寫入二進製和附加二進製模式下,它返回一個 io.BufferedWriter ,在讀/寫模式下,它返回一個 io.BufferedRandom 。禁用緩衝時,將返回原始流,即 io.RawIOBase 的子類 io.FileIO

另請參閱文件處理模塊,例如 fileinputio (其中聲明了 open() )、 osos.pathtempfileshutil

使用參數 filemodeflags 引發審計事件 open

modeflags 參數可能已被修改或從原始調用中推斷出來。

在 3.3 版中更改:
  • 添加了opener 參數。

  • 添加了'x' 模式。

  • IOError 曾經被提出,現在是 OSError 的別名。

  • 如果以獨占創建模式('x')打開的文件已經存在,則會引發 FileExistsError

在 3.4 版中更改:
  • 該文件現在不可繼承。

自 3.4 版起已棄用,在 3.10 版中刪除: 'U'模式。

在 3.5 版中更改:
  • 如果係統調用被中斷並且信號處理程序沒有引發異常,則該函數現在重試係統調用而不是引發InterruptedError例外(見PEP 475理由)。

  • 添加了'namereplace' 錯誤處理程序。

在 3.6 版中更改:
  • 添加了支持以接受實現 os.PathLike 的對象。

  • 在 Windows 上,打開控製台緩衝區可能會返回 io.RawIOBase 的子類,而不是 io.FileIO

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 open。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。