Python os和os.path的基础知识与常用操作
目錄
1 os與os.path的關系
2 os和os.path的常用屬性和方法
2.1 os模塊常用屬性
2.2 os模塊常用方法
2.3 os.path模塊常用方法
2.3.1 路徑的常用操作
2.3.2 文件/目錄訪問時間與大小查詢
3 文件遍歷的兩種方法
3.1 采用os.listdir()獲取文件列表并遍歷
3.2 采用os.walk()方法遍歷
1 os與os.path的關系
os和os.path是兩個模塊,不能將path看作os的子模塊。對于二者的聯系,可以從os的一段源碼中加以觀察,摘錄如下:
if 'posix' in _names:name = 'posix'linesep = '\n'from posix import *try:from posix import _exit__all__.append('_exit')except ImportError:passimport posixpath as pathtry:from posix import _have_functionsexcept ImportError:passimport posix__all__.extend(_get_exports_list(posix))del posixelif 'nt' in _names:name = 'nt'linesep = '\r\n'from nt import *try:from nt import _exit__all__.append('_exit')except ImportError:passimport ntpath as pathimport nt__all__.extend(_get_exports_list(nt))del nttry:from nt import _have_functionsexcept ImportError:passelse:raise ImportError('no os specific module found')sys.modules['os.path'] = path from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep,devnull)首先是一段長長的if判斷語句,這段語句的目的是導入posixpath模塊或者ntpath模塊,導入哪一個取決于操作系統,對于windows系統來說導入的是ntpath,導入后以path的名稱使用(import ntpath as path)。
sys.modules['os.path'] = path 揭示了os和os.path的關系,sys.modules是一個記錄了當前程序導入的所有模塊的字典,字典的值是上面導入的別名為path的模塊(一個對象),os.path作為一個名稱通過鍵值對的方式指向這個對象的內存地址。因此,導入os模塊的同時也就導入了os.path模塊。
from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep, devnull) 表明os中還導入了curdir、pardir、sep等一系列的屬性,因此我們通過 os.屬性名 調用這些屬性時,實際上是通過os調用os.path模塊中的屬性。
os模塊和os.path模塊的分工是:os用于支持文件/目錄的增、刪、改、查等處理,os.path用于支持文件屬性信息的相關操作。
?
2 os和os.path的常用屬性和方法
2.1 os模塊常用屬性
本節以表格的形式列舉經常用到的屬性。調用這些屬性能夠很好地支持跨平臺操作,比如在不同操作系統路徑分割符不同,就能夠通過os.sep獲取,避免了直接輸入造成的不兼容現象。
| 常用屬性 | 返回內容 | windows下返回值 |
| os.name | 當前操作系統 | nt |
| os.curdir | 當前目錄標識符 | . |
| os.pardir | 上一層目錄標識符 | .. |
| os.sep | 路徑名分隔符 | \\ |
| os.extsep | 文件名與擴展名分隔符 | . |
| os.linesep | 文本文件行分隔符 | \r\n |
2.2 os模塊常用方法
這里列舉os模塊提供的關于文件/目錄的查詢、新建、修改、刪除等常用操作的方法。
| 常用方法 | 參數 | 功能 | 返回值類型 |
| os.getcwd() | 無 | 獲取當前工作目錄 | str |
| os.chdir(path) | 目錄路徑 | 修改當前工作目錄到指定路徑 | 無 |
| os.listdir(path)? | 目錄路徑,不傳參為當前目錄 | 獲取指定目錄下的所有文件與目錄 | list |
| os.mkdir(path) | 目錄路徑 | 新建目錄 | 無 |
| os.makedirs(path) | 目錄路徑 | 新建多層目錄 | 無 |
| os.rename(path1,path2) | 原路徑,新路徑 | 重命名與移動文件或目錄 | 無 |
| os.rmdir(path) | 目錄地址 | 刪除空目錄 | 無 |
| os.removedirs(path) | 目錄路徑 | 刪除多層空目錄 | 無 |
| os.remove(path) | 文件路徑 | 刪除指定文件 | 無 |
2.3 os.path模塊常用方法
os.path主要用于文件屬性信息的相關操作,這里分兩部分列舉該模塊下的常用方法,一是路徑的常用操作,二是文件/目錄訪問時間與大小查詢。
2.3.1 路徑的常用操作
路徑是以字符串的形式表達的,os.path中關于路徑的方法中很多都是路徑字符串的分隔或拼接。列舉如下:
1? os.path.abspath(str):獲取文件/目錄的絕對路徑
參數是一個字符串,可以是存在文件或目錄,也可以是不存在的文件和目錄,返回值是傳入的字符串與當前目錄組成的絕對路徑,例如:
import os# 先打印出當前路徑 cwd = os.getcwd() print(cwd) # E:\開發項目\os-noteabs_path = os.path.abspath("a.txt") print(abs_path) # 返回絕對路徑:E:\開發項目\os-note\a.txtabs_path = os.path.abspath(r"..\folder") print(abs_path) # 返回與上一層目錄組成的絕對路徑:E:\開發項目\folder2? os.path.basename(path):返回路徑中最后一級目錄或文件
import os# 獲取路徑最后一級的目錄名 base_dir = os.path.basename(r"E:\開發項目\os-note\last_dir") print(base_dir) # last_dir# 獲取路徑中的完整文件名 base_file = os.path.basename(r"E:\開發項目\os-note\a.txt") print(base_file) # a.txt3? os.path.dirname(path):返回路徑最后一級目錄或文件的上層目錄的完整路徑
import os# 獲取最后一級目錄之前的路徑 dir_name = os.path.dirname(r"E:\開發項目\os-note\last_dir") print(dir_name) # E:\開發項目\os-note# 獲取文件名之前的路徑 dir_name = os.path.dirname(r"E:\開發項目\os-note\a.txt") print(dir_name) # E:\開發項目\os-note4? os.path.split(path):將dirname和basename分隔開來,返回一個元組
import os# 分隔 最后一級目錄 與 上層目錄的路徑 split_tuple = os.path.split(r"E:\開發項目\os-note\last_dir") print(split_tuple) # ('E:\\開發項目\\os-note', 'last_dir')# 分隔 文件 與 上層目錄的路徑 split_tuple = os.path.split(r"E:\開發項目\os-note\a.txt") print(split_tuple) # ('E:\\開發項目\\os-note', 'a.txt')5? os.path.splitext(path):將文件或路徑中的擴展名與其前面的部分分隔開,返回一個元組
import os# 分隔 文件名/路徑 與 擴展名 splitext_tuple = os.path.splitext("a.txt") print(splitext_tuple) # ('a', '.txt')splitext_tuple = os.path.splitext(r"E:\開發項目\os-note\a.txt") print(splitext_tuple) # ('E:\\開發項目\\os-note\\a', '.txt')6? os.path.splitdrive(path):將路徑中的驅動器與其后面的部分分隔開,返回一個元組
import os# 分隔 驅動器 與 路徑 splitdrive_tuple = os.path.splitdrive(r"E:\開發項目\os-note\a.txt") print(splitdrive_tuple) # ('E:', '\\開發項目\\os-note\\a.txt')7? os.path.join(*str):路徑的拼接,支持兩個及以上的路徑部分
import os# 路徑的拼接 path_join = os.path.join("D:\\python-note\\os-note", "a.xlsx") print(path_join) # D:\python-note\os-note\a.xlsxpath_join = os.path.join("D:\\python-note", "os-note", "note", "a.txt") print(path_join) # D:\python-note\os-note\note\a.txt8? os.path.isabs(path):判斷是否是絕對路徑,返回布爾值
import osb = os.path.isabs(r"D:\\python-note\\os-note\\4.xlsx") print(b) # Trueb = os.path.isabs(r"..\\4.xlsx") print(b) # False9? os.path.isdir(path):判斷路徑是否指向一個存在的目錄,返回布爾值
import osb = os.path.isdir(r"D:\\python-note\\os-note") print(b) # True 指向一個 存在 的目錄b = os.path.isdir(r"D:\\python-note\\abc") print(b) # False 指向一個 不存在 的目錄b = os.path.isdir(r"..\\4.xlsx") print(b) # False 指向的不是目錄10 os.path.isdir(path):判斷路徑是否指向一個存在的文件,返回布爾值
import osb = os.path.isfile(r"D:\\python-note\\os-note") print(b) # False 指向的不是文件b = os.path.isfile(r"D:\\python-note\\6.xlsx") print(b) # False 指向的是一個 不存在 的文件b = os.path.isfile(r"D:\\python-note\\os-note\\4.xlsx") print(b) # True 指向的是一個 存在 的文件2.3.2 文件/目錄訪問時間與大小查詢
1? os.path.getatime(path):文件或目錄的最近訪問時間,返回時間戳(浮點數)
import os import time# 文件的最近訪問時間 at = os.path.getatime(r"D:\\python-note\\os-note\\4.xlsx") print(at) # 浮點數時間戳:1621404235.672548 print(time.ctime(at)) # 格式化:Wed May 19 14:03:55 2021# 目錄的最近訪問時間 at = os.path.getatime(r"D:\\python-note\\os-note") print(time.ctime(at)) # Mon May 24 19:56:51 20212? os.path.getctime(path):文件或目錄的最近創建時間,返回時間戳(浮點數)
import os import time# 文件的最近創建時間 ct = os.path.getctime(r"D:\\python-note\\os-note\\4.xlsx") print(time.ctime(ct)) # Wed May 19 10:59:07 2021# 目錄的最近創建時間 ct = os.path.getctime(r"D:\\python-note\\os-note") print(time.ctime(ct)) # Wed May 19 10:54:51 20213? os.path.getmtime(path):文件或目錄的最近修改時間,返回時間戳(浮點數)
import os import time# 文件的最近創建時間 mt = os.path.getmtime(r"D:\\python-note\\os-note\\4.xlsx") print(time.ctime(mt)) # Thu Apr 8 11:34:40 2021# 目錄的最近創建時間 mt = os.path.getctime(r"D:\\python-note\\os-note") print(time.ctime(mt)) # Wed May 19 10:54:51 20214? os.path.getsize(path):文件的大小,返回整數,單位是bit
import os# 獲取文件的大小 size = os.path.getsize(r"D:\\python-note\\os-note\\4.xlsx") print(size) # 22197# 將單位轉換成kB,保留兩位小數 size = size / 1024 print("文件大小為:%.2f kB" % size) # 文件大小為:21.68 kB?
3 文件遍歷的兩種方法
3.1 采用os.listdir()獲取文件列表并遍歷
案例:遍歷指定目錄及其所有子目錄,找到所有文件,并打印出絕對路徑
import osdef get_all_files(path):try:files = os.listdir(path) # 獲取文件列表if files: # 如果文件列表不為空for file in files: # 遍歷文件列表path_join = os.path.join(path, file) # 拼接絕對路徑if (os.path.isfile(path_join)): # 如果是文件print(path_join)else: # 如果不是文件,就是目錄,遞歸調用方法get_all_files(path_join)else:passexcept FileNotFoundError:passget_all_files(r"D:\\python-note")運行結果
D:\\python-note\hello.txt D:\\python-note\os-note\4.xlsx D:\\python-note\os-note\newFolder\2.csv D:\\python-note\os-note\newFolder2\3.xlsx D:\\python-note\os-note\test-rename.csv3.2 采用os.walk()方法遍歷
第一個參數是路徑,第二個參數是遍歷模式,topdown默認為True:優先遍歷外層目錄,topdown設置為False:優先遍歷內層目錄。
返回的是一個生成器(generator)對象,用for循環遍歷,每一次遍歷得到一個元組,內容包括:根目錄、目錄列表、文件列表
topdown=True的示例:
import os# 優先遍歷外層目錄,從外向內遍歷 for root, dirs, files in os.walk(r"D:\\python-note"):print(root, dirs, files)運行結果
D:\\python-note ['newFolder2', 'os-note'] ['hello.txt'] 優先得到最外層的根、目錄列表、文件列表 D:\\python-note\newFolder2 [] [] D:\\python-note\os-note ['newFolder', 'newFolder2'] ['4.xlsx', 'test-rename.csv'] D:\\python-note\os-note\newFolder [] ['2.csv'] D:\\python-note\os-note\newFolder2 [] ['3.xlsx']topdown=False的示例:
import osfor root, dirs, files in os.walk(r"D:\\python-note", False):print(root, dirs, files)運行結果
D:\\python-note\newFolder2 [] [] D:\\python-note\os-note\newFolder [] ['2.csv'] D:\\python-note\os-note\newFolder2 [] ['3.xlsx'] D:\\python-note\os-note ['newFolder', 'newFolder2'] ['4.xlsx', 'test-rename.csv'] D:\\python-note ['newFolder2', 'os-note'] ['hello.txt'] 最后得到最外層的根、目錄列表、文件列表用os.path.walk()方法完成上一節的案例,只需要三行代碼
import osfor root, dirs, files in os.walk(r"D:\\python-note"):for file in files:print(os.path.join(root,file))運行結果
D:\\python-note\hello.txt D:\\python-note\os-note\4.xlsx D:\\python-note\os-note\test-rename.csv D:\\python-note\os-note\newFolder\2.csv D:\\python-note\os-note\newFolder2\3.xlsx?
總結
以上是生活随笔為你收集整理的Python os和os.path的基础知识与常用操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构学习笔记(一):链表(linke
- 下一篇: 数据结构学习笔记(三):队列(queue