目录

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:\开发项目\folder

2  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.txt

3  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-note

4  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.txt

8  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)  # False

9  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 2021

2  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 2021

3  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 2021

4  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.csv

3.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的基础知识与常用操作相关推荐

  1. 神经网络基础知识、常用激活函数及其Python图形绘制

    在人工智能与机器学习研究与应用领域,神经网络占有重要地位.神经网络(Neural Networks, NNs),又称人工神经网络(Artificial Neural Networks, ANNs),是 ...

  2. Python计算机视觉编程第十章——OpenCV基础知识

    Python计算机视觉编程 (一)OpenCV 的 Python 接口 (二)OpenCV 基础知识 2.1 读取和写入图像 2.2 颜色空间 2.3 显示图像及结果 (三)处理视频 3.1 视频输入 ...

  3. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符

    Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...

  4. Python基础知识与常用数据类型

    Python基础知识与常用数据类型 目录 Python基础知识与常用数据类型 一.Python概述: 二.Python中的基础语法: 三.Python内置数据结构: 4.附录 一.Python概述: ...

  5. 总结Linux基础知识和常用渗透命令!!!

    作为Web渗透的初学者,Linux基础知识和常用命令是我们的必备技能,本文详细讲解了Linux相关知识点及Web渗透免了高龄.如果想玩好Kali或渗透,你需要学好Linux及相关命令,以及端口扫描.漏 ...

  6. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  7. db2 replace函数的用法_SQL基础知识:常用字符处理函数

    原标题:SQL基础知识:常用字符处理函数 作者:丶平凡世界

  8. 重拾Java基础知识:运算符操作

    Java基础知识:运算符操作 前言 优先级 赋值 算术运算符 一元加减运算符 递增和递减 关系运算符 逻辑运算符 短路 位运算符 与(&) 或(|) 异或(^) 反(~) 左移(<< ...

  9. Day 01嵌入式学习之Linux基础知识和命令操作

    学习嵌入式开发的随堂笔记 Day 01嵌入式学习之linux基础知识和命令操作 1.英文: read:读,r字母 write:写,w字母 execute:执行,运行,x字母 directory:目录, ...

最新文章

  1. html 中设置样式方式,在html元素中设置css样式的方式是什么
  2. LeetCode Remove Nth Node From End of List
  3. exe注册为service服务
  4. python2 urllib2,Python urllib2保持活着
  5. centos7镜像加速_使用阿里云容器镜像服务托管私有Docker镜像
  6. DL之LeNet-5:LeNet-5算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  7. linux下uvc协议访问usb摄像头,Ubuntu调用USB摄像头
  8. 【Qt】2D绘图之绘图中其它问题
  9. 移动端页面rem+media写法过程
  10. 我对Pass、SaaS、IaaS的理解
  11. 超强 | 保险单据在线OCR,秒速识别保单信息
  12. kvm迁移镜像启动报错
  13. 2021年前端部署的灵魂拷问
  14. SD卡、记忆棒等内存卡的数据恢复方法
  15. 统计|两个总体方差比的区间估计(用公式计算)
  16. matlab中ode指令,在Matlab中使用ODE选择步长
  17. 管理者的50堂课之创始人篇 读书笔记
  18. Windows自带的造字功能使用
  19. 数学建模方法-灰色预测法
  20. 1. 全连接神经网络

热门文章

  1. pythonmax对字符_(MAX第五篇)Python--字符串操作(三)
  2. 600 imp oracle_oracle数据库的导入导出(imp和exp)
  3. java中static关键字的解析
  4. 章节六、2-异常---运行时异常
  5. 用java实现二分搜索算法分析
  6. UVa 10082 - WERTYU 解题报告 - C语言
  7. LeetCode(9) - Palindrome Number
  8. C. Present(二分 + 扫描线)
  9. FJOI2018二试游记
  10. junit4 javaee 5.0 jpa SSH 单元测试问题集锦