python模塊百科_操作系統接口_os【一】
- `os` --- 多種操作系統接口
- 一、相關模塊
- 1.1 os.path 文件路徑
- 1.2 fileinput 文件讀取
- 1.3 tempfile 臨時文件和目錄
- 1.4 shutil 高級文件和目錄
- 1.5 platform 操作系統底層模塊
- 二、關于函數適用性的說明
- 2.1 與操作系統相同的接口
- 2.2 支持字節串和字符串
- 2.3 exception OSError
- 三、文件名,命令行參數,以及環境變量
- 四 文件系統編碼格式與錯誤處理句柄
- 五、locale encoding -- 語言區域編碼格式
- 六、Python UTF-8 模式
os
— 多種操作系統接口
源代碼: Lib/os.py
??os
模塊提供了與操作系統交互的多種功能。可以使用 os
模塊來執行文件或目錄操作,如讀取或修改環境變量、訪問命令行參數、處理文件路徑、執行系統命令等。
一、相關模塊
1.1 os.path 文件路徑
??os.path
模塊提供了許多用于處理文件和目錄路徑的功能,包含了跨平臺的、對路徑名進行操作的功能。
以下是 os.path
模塊中一些常用的函數:
-
os.path.abspath(path)
返回指定文件或目錄的絕對路徑。 -
os.path.basename(path)
返回指定文件或目錄路徑的最后一個組成部分,相當于os.path.split(path)[1]
。 -
os.path.commonprefix(lists)
返回列表中所有路徑名共有的最長公共前綴。 -
os.path.dirname(path)
返回指定文件或目錄路徑的目錄名稱,相當于os.path.split(path)[0]
。 -
os.path.exists(path)
如果路徑存在則返回True
,否則返回False
。 -
os.path.expanduser(path)
如果路徑名以~
開頭,則將其替換為當前用戶的主目錄。 -
os.path.expandvars(path)
擴展路徑中的環境變量,如$HOME
。 -
os.path.getatime(path)
返回文件最后訪問時間的時間戳。 -
os.path.getmtime(path)
返回文件最后修改時間的時間戳。 -
os.path.getsize(path)
返回文件的大小(以字節為單位)。 -
os.path.isabs(path)
如果路徑是絕對路徑,則返回True
,否則返回False
。 -
os.path.isfile(path)
如果路徑指向一個存在的文件,則返回True
,否則返回False
。 -
os.path.isdir(path)
如果路徑指向一個存在的目錄,則返回True
,否則返回False
。 -
os.path.islink(path)
如果路徑指向一個符號鏈接,則返回True
,否則返回False
。 -
os.path.ismount(path)
如果路徑指向一個掛載點(如 UNIX 中的掛載文件系統點),則返回True
,否則返回False
。 -
os.path.join(path1, path2, …)
連接一個或多個路徑組件。 -
os.path.lexists(path)
如果路徑存在(無論它是文件還是目錄),則返回True
,否則返回False
。 -
os.path.normcase(path)
將路徑名轉換為適當的規范形式。 -
os.path.normpath(path)
規范化路徑,例如解析.
和..
。 -
os.path.realpath(path)
返回指定文件或目錄的絕對路徑,解析所有符號鏈接。 -
os.path.relpath(path, start=None)
返回從start
到path
的相對路徑。 -
os.path.samefile(path1, path2)
如果path1
和path2
指向同一文件或目錄,則返回True
,否則返回False
。 -
os.path.sameopenfile(fp1, fp2)
如果兩個文件描述符fp1
和fp2
指向同一文件,則返回True
,否則返回False
。 -
os.path.samestat(stat1, stat2)
如果兩個 stat 對象(通常是通過os.stat()
獲取的)代表同一文件,則返回True
,否則返回False
。 -
os.path.split(path)
將路徑分割為目錄和文件名,并返回元組(dir, file)
。 -
os.path.splitext(path)
分割路徑為文件名和擴展名,并返回元組(filename, extension)
。
1.2 fileinput 文件讀取
??fileinput
允許你輕松地迭代多個輸入流(通常是文件),而無需顯式地打開和關閉它們。這對于從命令行讀取多個文件特別有用,尤其是當你想使用相同的代碼邏輯處理多個文件時。
??以下是使用 fileinput
模塊的基本示例:
import fileinput# 處理單個文件
for line in fileinput.input('example.txt'):print(line, end='')# 處理多個文件
for line in fileinput.input(['file1.txt', 'file2.txt']):print(line, end='') # 命令行輸入
for line in fileinput.input():print(line, end='')
fileinput
模塊還提供了以下函數:
fileinput.filename()
: 返回當前正在讀取的文件的名稱。fileinput.lineno()
: 返回當前正在讀取的行的行號。fileinput.filelineno()
: 返回當前正在讀取的行在其文件內的行號。fileinput.isfirstline()
: 如果當前行是文件的第一行,則返回 True。fileinput.isstdin()
: 如果當前行來自標準輸入(即命令行),則返回 True。
1.3 tempfile 臨時文件和目錄
??tempfile
模塊在 Python 中用于創建臨時文件和目錄。它提供了一種安全、跨平臺的方式來處理臨時文件,這些文件在程序結束時通常會被自動刪除。tempfile
模塊中的這些函數和類使得處理臨時文件和目錄變得簡單和安全,尤其是在需要處理敏感數據或避免文件泄露的情況下。
以下是 tempfile
模塊中一些常用的函數:
-
tempfile.TemporaryFile([mode=‘w+b’, buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True])
創建一個臨時文件,并返回一個文件對象。如果delete
參數為True
(默認值),則文件會在關閉后自動刪除。 -
tempfile.NamedTemporaryFile([mode=‘w+b’, buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True])
類似于TemporaryFile
,但返回一個文件對象,并且該文件有一個確定的文件名,可以通過文件對象的name
屬性來訪問。 -
tempfile.TemporaryDirectory([suffix=None, prefix=None, dir=None])
創建一個臨時目錄,并返回一個TemporaryDirectory
對象。當對象被銷毀時,目錄及其內容會被自動刪除。 -
tempfile.mkstemp([suffix, prefix, dir, text])
生成一個唯一的臨時文件名,但不創建文件。返回文件描述符和文件路徑。 -
tempfile.mkdtemp([suffix, prefix, dir])
生成一個唯一的臨時目錄名,并創建該目錄。返回目錄路徑。 -
tempfile.gettempdir()
返回用于創建臨時文件和目錄的默認目錄。 -
tempfile.gettempprefix()
返回用于生成臨時文件名和目錄名的默認前綴。 -
tempfile.tempfile.tempdir
這是一個變量,可以設置或獲取用于創建臨時文件和目錄的默認目錄。
以下是 tempfile
模塊的函數示例:
import tempfile# 創建一個臨時文件
with tempfile.TemporaryFile() as tmp:tmp.write(b'Hello, world!')tmp.seek(0)print(tmp.read())# 創建一個有名字的臨時文件
with tempfile.NamedTemporaryFile(delete=False) as tmp:tmp.write(b'Hello, named temp file!')tmp.seek(0)print(tmp.read())# 文件不會被自動刪除,因為它是在 delete=False 下創建的# 你可以通過 tmp.name 訪問其文件名# 創建一個臨時目錄
with tempfile.TemporaryDirectory() as tmpdir:print(f"Created temporary directory: {tmpdir}")# 在這個 with 塊內,tmpdir 存在# 當 with 塊結束時,tmpdir 和其內容會被自動刪除# 生成一個唯一的臨時文件名,但不創建文件
fd, path = tempfile.mkstemp()
print(f"Unique temporary file name: {path}")
# 需要自己關閉文件描述符
os.close(fd)# 生成一個唯一的臨時目錄名,并創建該目錄
path = tempfile.mkdtemp()
print(f"Unique temporary directory: {path}")
# 需要自己手動刪除目錄
os.rmdir(path)
1.4 shutil 高級文件和目錄
??shutil
提供了高級的文件、文件夾和文件流操作,使得文件和文件夾的操作更加便捷。當需要執行比簡單的文件讀寫更復雜的操作時,通常會使用 shutil
。shutil
是 “shell utilities” 的縮寫,意味著它提供了一些類似于 Unix shell 命令的功能。
以下是一些 shutil
模塊中常用的函數:
-
shutil.copy(src, dst)
復制文件從src
到dst
。 -
shutil.copy2(src, dst)
復制文件,并嘗試保留文件的元數據(如修改時間、訪問權限等)。 -
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞歸地復制整個文件夾及其內容。 -
shutil.rmtree(path, ignore_errors=False, οnerrοr=None)
遞歸地刪除整個文件夾及其內容。 -
shutil.move(src, dst)
將文件或文件夾從src
移動到dst
。 -
shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None)
創建一個歸檔文件(如 ZIP、TAR 等)。 -
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)
查找可執行文件的路徑。 -
shutil.register_archive_format(name, function, extra_args=None, description=None)
注冊一個新的歸檔格式。 -
shutil.unregister_archive_format(name)
取消注冊一個歸檔格式。
以下是 shutil
模塊的函數示例:
import shutil# 復制文件
shutil.copy('source.txt', 'destination.txt')# 復制文件夾
shutil.copytree('source_folder', 'destination_folder')# 刪除文件夾
shutil.rmtree('folder_to_remove')# 移動文件
shutil.move('old_name.txt', 'new_name.txt')# 創建 ZIP 歸檔
shutil.make_archive('my_archive', 'zip', 'path_to_folder_to_archive')# 查找特定命令的路徑
path_to_python = shutil.which('python')
print(f"Path to python: {path_to_python}")
1.5 platform 操作系統底層模塊
??platform
提供了許多與底層平臺相關的信息,如操作系統的名稱、版本、架構等。使用 platform
模塊可以編寫更可移植的代碼,因為可以根據運行代碼的操作系統來做出不同的行為或決策。
??這個模塊允許在不知道代碼將在哪種操作系統上運行時,仍然能夠收集有關底層系統的有用信息。在編寫需要適應不同環境的軟件時,這是非常有幫助的。
以下是 platform
模塊中常用的屬性:
-
platform.system()
返回操作系統名稱,例如 ‘Windows’, ‘Linux’, ‘Darwin’(對于 MacOS)。 -
platform.node()
返回機器的主機名。 -
platform.release()
返回操作系統的發行版本號。 -
platform.version()
返回操作系統的版本信息。 -
platform.machine()
返回機器的硬件名稱,例如 ‘x86’, ‘AMD64’, ‘ARM’。 -
platform.processor()
返回機器的處理器名稱,例如 ‘Intel64 Family 6 Model 158 Stepping 9, GenuineIntel’。 -
platform.python_version()
返回 Python 解釋器的版本。 -
platform.python_compiler()
返回用于編譯 Python 解釋器的編譯器。 -
platform.python_branch()
返回 Python 解釋器的分支名稱。 -
platform.python_revision()
返回 Python 解釋器的修訂版本號。 -
platform.python_build()
返回 Python 解釋器的構建時間戳和構建標識符。 -
platform.python_implementation()
返回 Python 解釋器的實現名稱,例如 ‘CPython’, ‘Jython’, ‘IronPython’。
以下是 platform
模塊中常用的函數:
-
platform.uname()
返回一個包含五個屬性的元組,與 POSIXuname
命令返回的類似,包括系統名稱、節點名稱、發布版本、版本和機器名稱。 -
platform.architecture()
返回一個元組,包含位大小和鏈接的庫名稱。 -
platform.libc_ver()
返回 C 庫版本信息,通常是一個包含兩個元素的元組。
以下是 platform
模塊的函數示例:
import platform# 輸出操作系統信息
print("Operating System:", platform.system())
print("Release Version:", platform.release())
print("Machine Hardware:", platform.machine())
print("Processor:", platform.processor())# 輸出Python解釋器信息
print("Python Version:", platform.python_version())
print("Python Compiler:", platform.python_compiler())
print("Python Branch:", platform.python_branch())
print("Python Revision:", platform.python_revision())# 獲取更多信息
print("OS name and version:", platform.platform())
print("OS uname info:", platform.uname())
print("Architecture info:", platform.architecture())
print("C library version:", platform.libc_ver())
二、關于函數適用性的說明
2.1 與操作系統相同的接口
??Python中所有依賴于操作系統的內置模塊的設計都是一樣,只要不同的操作系統某一相同的功能可用,它就使用相同的接口。
??例如,函數 os.stat(path)
以相同的格式返回關于 path 的狀態信息(該格式源于 POSIX 接口)。
??特定于某一操作系統的擴展通過操作 os
模塊也是可用的,但是使用它們是對可移植性的一種威脅。
2.2 支持字節串和字符串
??所有接受路徑或文件名的函數都同時支持字節串和字符串對象,并在返回路徑或文件名時使用相應類型的對象作為結果。
2.3 exception OSError
??如果使用無效或無法訪問的文件名與路徑,或者其他類型正確但操作系統不接受的參數,os
模塊的所有函數都拋出 OSError
(或者它的子類)。OSError
的別名是os.error
三、文件名,命令行參數,以及環境變量
??在 Python 中,使用字符串類型表示文件名、命令行參數和環境變量。 在某些系統上,在將這些字符串傳遞給操作系統之前,必須將這些字符串解碼為字節。
??Python 使用 filesystem encoding and error handler
來執行此轉換,可以通過 sys.getfilesystemencoding()
獲取在文件系統中編碼文件名的字符串。這通常與操作系統的默認文件系統編碼有關。
??例如,在 Unix 和 Linux 系統中,默認的文件系統編碼通常是 ‘UTF-8’。而在 Windows 中,這取決于系統配置和版本,但通常是 ‘cp1252’。
??這里是一個簡單的例子來演示如何使用這個函數:
import sysfilesystem_encoding = sys.getfilesystemencoding()
print("Filesystem encoding:", filesystem_encoding)
注意:文件系統編碼可能不同于 Python 解釋器用來解釋源代碼的編碼,后者可以通過在源代碼文件的開頭添加特殊的注釋來指定(例如 # coding: utf-8
)
??filesystem encoding and error handler
是在 Python 啟動時通過 PyConfig_Read()
函數來配置的:請參閱 PyConfig
的 filesystem_encoding
和 filesystem_errors
等成員。
??文件系統編碼器 必須保證能成功解碼所有 128 以內的字節。如果不能保證,API 函數可能觸發 UnicodeError
。
四 文件系統編碼格式與錯誤處理句柄
??filesystem encoding and error handler
是Python 用來從操作系統解碼字節串和向操作系統編碼 Unicode 的編碼格式與錯誤處理句柄。
??文件系統編碼格式必須保證能成功解碼長度在 128 以下的所有字節串。 如果文件系統編碼格式無法提供此保證,則 API 函數可能會引發 UnicodeError
。
??sys.getfilesystemencoding()
和 sys.getfilesystemencodeerrors()
函數可被用來獲取文件系統編碼格式與錯誤處理句柄。
??filesystem encoding and error handler
是在 Python 啟動時通過 PyConfig_Read()
函數來配置的:請查閱 PyConfig
的 filesystem_encoding
和 filesystem_errors
。
五、locale encoding – 語言區域編碼格式
??在 Unix 上,它是 LC_CTYPE 語言區域的編碼格式。 它可以通過 locale.setlocale(locale.LC_CTYPE, new_locale)
來設置。
??在 Windows 上,它是 ANSI 代碼頁 (如: "cp1252"
)。
??在 Android 和 VxWorks 上,Python 使用 "utf-8"
作為語言區域編碼格式。
??locale.getencoding()
可被用來獲取語言區域編碼格式。
六、Python UTF-8 模式
??Python UTF-8 模式是一個特殊的模式,此模式會忽略 locale encoding 并強制使用 UTF-8 編碼。如果在 Python 啟動時 LC_CTYPE 區域設為 C
或 POSIX
,則啟用 Python UTF-8 模式 (參見 PyConfig_Read()
函數)。它可以通過命令行選項 -X utf8
和環境變量 PYTHONUTF8
,來啟用或禁用。
??如果沒有設置 PYTHONUTF8
環境變量,那么解釋器默認使用當前的地區設置,除非 當前地區識別為基于 ASCII 的傳統地區(如 PYTHONCOERCECLOCALE
所述),并且 locale coercion 被禁用或失敗。在這種傳統地區,除非顯式指明不要如此,解釋器將默認啟用 UTF-8 模式。Python UTF-8 模式只能在 Python 啟動時啟用。其值可以從 sys.flags.utf8_mode
讀取。
??當處在Python UTF-8 模式下時,會出現以下特征:
- 用 UTF-8 作為 文件系統編碼。
sys.getfilesystemencoding()
返回'utf-8'
。locale.getpreferredencoding()
返回'utf-8'
(do_setlocale 參數不起作用)。sys.stdin
,sys.stdout
和sys.stderr
都將 UTF-8 用作它們的文本編碼,并且為sys.stdin
和sys.stdout
啟用surrogateescape
錯誤處理句柄 (sys.stderr
會繼續使用backslashreplace
如同在默認的局部感知模式下一樣)- 在 Unix 上,
os.device_encoding()
返回'utf-8'
而不是設備的編碼格式。
注意 UTF-8 模式下的標準流設置可以被 PYTHONIOENCODING
所覆蓋(在默認的區域感知模式下也同樣如此)。
??當低層級 API切換到UTF-8編碼后,其他高層級 API 也相應改變:
- 命令行參數,環境變量和文件名會使用 UTF-8 編碼來解碼為文本。
os.fsdecode()
和os.fsencode()
會使用 UTF-8 編碼。open()
,io.open()
和codecs.open()
默認會使用 UTF-8 編碼。 但是,它們默認仍將使用嚴格錯誤處理句柄,因此試圖在文本模式下打開二進制文件將可能引發異常,而不是生成無意義的數據。
(未完待續……)
may the odds be ever in your favor ~