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