笔者:风起怨江南 出处:https://blog.csdn.net/JackMengJin 笔者原创,文章转载需注明,如果喜欢请点赞+关注,感谢支持!
导读:内置模块os模块和os.path模块相关内容的讲解。
目录
os模块的常用操作
1.os模块介绍
2.绝对路径和相对路径
3. os.path常用操作
3.1 获取当前文件的绝对路径:
3.2 获取当前路径的父目录
3.3 路径拼接:连接目录与文件名或目录
3.4 返回最后一个目录或者文件
3.5 路径判断
4.os模块其他操作
4.1 显示/获取当前的工作路径
4.2 切换工作路径
4.3 获取当前路径下的目录列表
4.4 删除操作
4.5 在某个目录下创建新目录(文件夹)
4.6 获取文件或者目录信息
4.7 获取系统环境变量
4.8 运行shell命令
5. os.path的应用
os是操作系统的意思,而os模块的作用就是处理和操作系统相关的操作,比如处理文件和目录这些经常做的操作。
os模块是内置函数,所以导入方式直接import + 模块的方式即可:
import os
os模块源码的注释:
r"""OS routines for NT or Posix depending on what system we're on.
This exports:
- all functions from posix or nt, e.g. unlink, stat, etc.
- os.path is either posixpath or ntpath
- os.name is either 'posix' or 'nt'
- os.curdir is a string representing the current directory (always '.')
- os.pardir is a string representing the parent directory (always '..')
- os.sep is the (or a most common) pathname separator ('/' or '\\')
- os.extsep is the extension separator (always '.')
- os.altsep is the alternate pathname separator (None or '/')
- os.pathsep is the component separator used in $PATH etc
- os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
- os.defpath is the default search path for executables
- os.devnull is the file path of the null device ('/dev/null', etc.)
Programs that import and use 'os' stand a better chance of being
portable between different platforms. Of course, they must then
only use functions that are defined by all platforms (e.g., unlink
and opendir), and leave all pathname manipulation to os.path
(e.g., split and join).
"""
通过os模块的官方注释可以看到,os模块同时适用于Linux系统(posix)和Windows系统(nt)。
通过os.可以看到os模块支持很多功能:
比如第一个os.name操作,表示显示当前使用的系统名。
Windows系统:
print(os.name)
nt
Linux系统:
print(os.name)
posix
而在Pyhton中文件路径相关的操作可以用os模块的子模块os.path模块去实现操作,在python3.6以上也可以用pathlib模块去实现文件操作,在学完类和对象后再去讲解pathlib模块的相关内容。
本文的重点还是对os.path模块的研究。
在学习os.path操作之前,先要搞清楚绝对路径和相对路径这两个概念:
绝对路径:绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。
完整的描述文件位置的路径就是绝对路径,以web站点根目录为参考基础的目录路径。
绝对路径名的指定是从树型目录结构顶部的根目录开始到某个目录或文件的路径,由一系列连续的目录组成,中间用斜线分隔,直到要指定的目录或文件,路径中的最后一个名称即为要指向的目录或文件。
之所以称为绝对,意指当所有网页引用同一个文件时,所使用的路径都是一样的。
os.path.abspath(__file__)可以得到当前文件的绝对路径:
print(os.path.abspath(__file__))
E:\MyLife\博客\demo.py
E:就是盘符,而在Linux系统下从系统根目录开始,以“/”为起始:
/home/jack/demo/demo.py
而相对路径,顾名思义就是一个路径相对于另一个路径的说法。
相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
通过用..表示为父目录。
比如在 E:\MyLife 目录下,E:\MyLife就是 E:\MyLife\博客 的父目录。
而在 E:\MyLife\博客 目录下的文件,直接\加相应目录即可。
比如说C盘demo文件夹下有两个文件1.txt和2.txt。
如果要以文件1.txt的视角说出文件2.txt的路径,那么它有两种表示方法:
C:\demo\2.txt
这就是绝对路径:指明2.txt文件在C盘demo文件下,从目录C盘盘符位置表示出来。
2
这就是相对路径:因为1文件和2文件都在C:\demo下,它们的路径前面"C:\demo"都是一样,所以不用表示出来。
os.path模块通常用于对文件路径的获取,并通过获取到的路径对文件进行操作。
可以看到os.path有很多操作,下面就举例一些常用的操作以供大家学习。
值得一提的是,path在这里是字符串类型,只是一个路径的表示,并不代表这个文件或路径真的存在。
所以在判断中对一个不存在的路径或者文件做判断,得到的结果就是False。
表示:os.path.abspath(path)
print(os.path.abspath(__file__))
E:\MyLife\博客\demo.py
绝对路径是动态获取的,在文件移动后会变化。
表示:os.path.dirname(path)
print(os.path.dirname(__file__))
E:\MyLife\博客
路径拼接和字符串拼接类似,因为用的是不定长参数,所以传什么参数就用逗号,隔开,可以一直加,加内容。
同时在windows系统中使用join会自动在两者间加反斜杠\,如果是Linux系统是正斜杠/。
表示:os.path.join(path,name)
print(os.path.join('D:/','hello.txt'))
D:/hello.txt
返回该路径的最后一个目录或者文件,如果path以/或\结尾,那么就会返回空值。
表示:os.path.basename(path)
print(os.path.basename(__file__))
True
而不管有多少/符号,总会打印出最后的文件名:
print(os.path.basename('///////////////demo.py'))
demo.py
print(os.path.basename(os.path.dirname(__file__)))
博客
print(os.path.basename('demo.py/'))
判断path是否为文件,如果path是一个文件,则返回True。
表示:os.path.isfile(path)
print(os.path.isfile(__file__))
True
print(os.path.isfile('demo.txt'))
False
判断path是否为目录,如果path是目录,则返回True。
表示:os.path.isdir(path)
print(os.path.isdir(__file__))
False
print(os.path.isdir(os.path.dirname(__file__)))
True
print(os.path.exists('D:'))
True
print(os.path.exists('R:'))
False
除了os.path模块的相关操作,os模块还有其他很多常用的操作,除了在上面举例的os.name用法,还有以下几种常用操作。
print(os.getcwd())
E:\MyLife\博客
os.chdir('D:')
print(os.listdir('D:'))
['$RECYCLE.BIN', '2345', 'Config.Msi', 'demo', 'game', 'tools', 'VM', 'WeChat', '新建文件夹']
由于删除操作非常危险,极其不推荐大家使用,了解即可。
os.rmdir('D:/test1')
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'D:/test1'
os.rmdir('D:/test/test.txt')
NotADirectoryError: [WinError 267] 目录名称无效。: 'D:/test/test.txt'
os.rmdir('D:/test')
OSError: [WinError 145] 目录不是空的。: 'D:/test/'
os.rmdir('D:/test')
由于删除操作太过危险,只提供方法:
os.remove('D:/test.txt')
os.mkdir('D:/demo_2020')
重复创建会报错:
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。
需要注意,这里只是创建文件夹,创建文件还是需要用open函数,具体用法会在后面讲解。
print(os.stat(__file__))
os.stat_result(st_mode=33206, st_ino=844424930216313, st_dev=18467, st_nlink=1, st_uid=0, st_gid=0, st_size=91, st_atime=1594480327, st_mtime=1594480326, st_ctime=1594369350)
print(os.environ)
environ({'#ENVTSLOGSSS27256': '102342928', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\MACHENIKE\\AppData\\Roaming', 'ASL.LOG': 'Destination=file', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'MJX', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'DRIVERDATA': })
Windox系统,相当于打开cmd终端:
os.system('dir')
E:\MyLife\demo
E:\MyLife\demo
2020/07/11 23:21 .
2020/07/11 23:21 ..
2020/07/11 23:21 132 demo.py
Linux系统:
os.system('pwd')
/home/jack/demo
需要注意的是,如果路径下有中文字符,那么打印会出现乱码。
当然os模块还有很多很多操作,这里就不一一列举,大家有时间可以自行摸索尝试。
上面说到os.path操作可以获取到文件或目录的路径,那么在实际场景中具体有什么用?
作用很多,比如导入数据,导入文件,打开配置文件等等,下面简单介绍就是在父目录下创建文件的实际应用操作。
比如当前在open函数文件夹下open_demo.py文件上进行操作,目的是:
获取到当前open_demo.py的绝对路径:
open_path = os.path.abspath(__file__)
print(open_path)
E:\MyLife\博客\open函数\open_demo.py
创建os模块文件夹:
os.mkdir('E:/MyLife/博客/os模块')
获取到open_demo.py文件的父级路径:
open_path = os.path.abspath(__file__)
dir_path = os.path.dirname(open_path)
print(dir_path)
E:\MyLife\博客\open函数
获取到博客文件夹路径:
open_path = os.path.abspath(__file__)
dir_path = os.path.dirname(open_path)
csdn_path = os.path.dirname(dir_path)
print(csdn_path)
E:\MyLife\博客
通过路径拼接得到新路径:
open_path = os.path.abspath(__file__)
dir_path = os.path.dirname(open_path)
csdn_path = os.path.dirname(dir_path)
os_path = os.path.join(csdn_path,'os_demo.py')
print(os_path)
E:\MyLife\博客\os_demo.py
最后通过with语句和open函数创建新文件,并在文件中写入“hello Jack!“:
open_path = os.path.abspath(__file__)
os.mkdir('E:/MyLife/博客/os模块')
dir_path = os.path.dirname(open_path)
csdn_path = os.path.dirname(dir_path)
os_path = os.path.join(csdn_path,'os模块')
os_file_path = os.path.join(os_path,'os_demo.py')
with open(os_file_path,mode='a',encoding='utf-8') as file:
file.write('"hello Jack!"')
最后优化下代码,判断下是否存在文件夹,如果存在则不创建:
# 判断是否存在文件夹
if not os.path.exists('E:/MyLife/博客/os模块'):
os.mkdir('E:/MyLife/博客/os模块')
# 博客路径
csdn_path = os.path.dirname(os.path.dirname(__file__))
# os模块路径
os_path = os.path.join(csdn_path,'os模块')
# os文件路径
os_file_path = os.path.join(os_path,'os_demo.py')
# 创建文件并写入内容
with open(os_file_path,mode='a',encoding='utf-8') as file:
file.write('"hello Jack!"')
优化后代码其实还是略显臃肿,在讲完类和对象之后,路径操作可以用pathlib模块代替,pathlib模块对文件路径操作更为方便和便捷,在之后的学习中再详细讲解。
以上便是《Python学习19:Python的os模块》的所有内容,原创不易,如果喜欢请点赞和关注,谢谢大家的支持!
想获得免费的学习资料请添加微信公众号——风起怨江南。