[TOC]
今天分享下python内置模块中的OS
模块,os模块是大家经常会使用到的,虽然有path
这个模块替代os
, 但是大家可能还是比较熟悉os
吧,那么我自己也总结下os
模块中常用的一些方法和属性。
怎么开始用这个模块呢,因为是内置的,所以不用额外安装,直接import
即可
import os
方法和变量 | 用途 |
---|---|
os.name | 查看当前操作系统的名称,windows返回nt ,linux返回posix |
os.environ | 获取系统环境变量 |
os.sep | 当前平台的路径分隔符,windown是\ ,linux是’/’ |
os.altsep | 可替代的路径分隔符,window中为/ . |
os.extsep | 文件名和文件拓展名之间分隔符的符号,windown为. |
os.pathsep | PATH环境变量中的分隔符,window为; linux为: |
os.linesep | 行结束符,windows为\r\n , linux为\n |
os.devnull | window为nul ,linux为/dev/null |
os.defpath | 当使用exec函数族的时候,如果没有指定PATH环境变量,则默认会查找os.defpath 中的值作为子进程PATH的值。 |
以下简单列几个常用的属性:
说明:返回的是当前操作系统的名称.
import os >>> os.name # windows返回结果: nt # linux返回结果 'posix'
说明:获取当前系统的环境变量.
>>> os.environ # windows返回结果 environ({'ALLUSERSPROFILE': 'C:\\ProgramData'...省略... # linux返回结果 >>> os.environ environ({'XDG_SESSION_ID': '2', 'HOSTNAME': 'localhost.localdomain'...省略...
说明:获取当前操作系统路径分隔符.
分隔符\
在windows和linux都能使用。
>>> os.sep # windows返回结果: '\\' # linux返回结果: '/'
举一个小栗子:
# windows组合一个路径 path = "log" with open(path + '/' + 'test.txt', 'w') as f: f.write('hello world.')
说明:获取当前操作系统行的分隔符.
>>> os.linesep # windows返回结果 '\r\n' # linux返回结果 '\n'
举个小栗子对比下:
windows环境下使用\r
行分隔符,也会换行
windows环境下使用\r\n
行分隔符,相当于换2行:
方法和变量 | 用途 |
---|---|
os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径 |
os.chdir() | 改变当前工作目录 |
os.curdir | 返回当前目录. , |
os.pardir | 获取当前目录的父目录.. |
os.makedirs(’) | 当前路径创建一个目录(可多级目录创建) |
os.removedirs() | 递归删除空目录 |
os.mkdir() | 生成单级目录 |
os.rmdir() | 删除单级空目录 |
os.listdir() | 列出指定目录下的所有文件和子目录,包括隐藏文件. |
os.remove(filename) | 删除文件 |
os.rename(old, new) | 重命名文件或文件夹 |
os.stat() | 获取文件或文件夹信息 |
os.path.abspath() | 获取文件或文件夹的绝对路径 |
os.path.split() | 获取返回文件夹和文件二元组 |
os.path.dirname() | 获取返回的是路径中的目录名,看做是split 后的第一个元素 |
os.path.basename() | 获取返回的是路径中的文件名,看做是split 后的第二个元素 |
os.path.exists() | 判断文件夹、文件是否存在,返回的是布尔值:true 、false |
os.path.isabs() | 判断路径是否是绝对路径,返回的是布尔值:true 、false |
os.path.isfile() | 判断是否是文件,返回的是布尔值:true 、false |
os.path.isdir() | 判断是否是目录,返回的是布尔值:true 、false |
os.path.join() | 将多个路径组合返回一个路径 |
os.path.getsize() | 获取返回的是文件内容字符串的长度 |
os.walk() | 获取递归目录,返回的是一个三元组(根目录, 目录, 文件) |
说明:获取当前工作目录.
>>> os.getcwd() 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37'
说明:改变当前工作目录(切换目录).
# 字符串前面加个r,让里面符号不转义 >>> os.chdir(r"E:\01 Network\07 Program\python\test") # 当前工作目录已切换 >>> os.getcwd() 'E:\\01 Network\\07 Program\\python\\test'
说明:可创建多级目录.
>>> os.makedirs("test1/test11")
说明:可递归删除空目录,一定都是空目录才能删除.
>>> os.removedirs("test1/test11")
如果不是空目录,则会报错:
OSError: [WinError 145] 目录不是空的。: 'test1/test11'
说明:创建单级目录.
>>> os.mkdir("test1")
如果创建多级不存在目录或者已存在目录创建,都会报错:
>>> os.mkdir("test1/test11") Traceback (most recent call last): File "<pyshell#51>", line 1, in <module> os.mkdir("test1/test11") FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test11'
说明:删除单级空目录.
>>> os.rmdir("test1")
如果目录不为空,则会报错:
>>> os.rmdir("test1") Traceback (most recent call last): File "<pyshell#85>", line 1, in <module> os.rmdir("test1") OSError: [WinError 145] 目录不是空的。: 'test1'
说明:列出当前目录下的文件夹、文件及隐藏文件.
>>> os.listdir() ['.git', '.idea', 'book', 'network', 'new_test.txt', 'test1', 'venv', '__pycache__']
说明:删除文件.
>>> os.remove("test1/test1.txt")
如果文件不存在,则会报错:
>>> os.remove("test1/test1.txt") Traceback (most recent call last): File "<pyshell#133>", line 1, in <module> os.remove("test1/test1.txt") FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'test1/test1.txt'
说明:重命名文件或文件夹.
>>> os.rename("test1/test1.txt", "test1/test11.txt") >>> os.listdir("test1") ['test11', 'test11.txt', 'test12'] # 已经变成了test11.txt
说明:获取文件或文件夹信息.
# 目录信息 >>> os.stat("test1") os.stat_result(st_mode=16895, st_ino=2533274791006554, st_dev=3243071515, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1630948576, st_mtime=1630948538, st_ctime=1630947394) # 文件信息 >>> os.stat("test1/test11.txt") os.stat_result(st_mode=33206, st_ino=562949954031987, st_dev=3243071515, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1630948524, st_mtime=1630948524, st_ctime=1630948489)
说明:获取文件或文件夹的绝对路径.
# 输入文件名,可以获取绝对路径 >>> os.path.abspath("test1/test11.txt") 'E:\\01 Network\\07 Program\\python\\test\\test1\\test11.txt'
说明:将路径分割成以文件夹和文件名的二元组.
# 元组第一个元素是文件夹,第二个元素是文件名 >>> os.path.split("test1/test11.txt") ('test1', 'test11.txt')
如果文件夹为空,则返回空字符串、文件夹二元组:
>>> os.path.split("test1") ('', 'test1')
说明:返回的是路径中目录名,可以看作是split
分割后的第一个元素.
>>> os.path.dirname("test1/test11.txt") 'test1'
说明:返回的是路径中的文件名,可以看作是split
分割后的第二个元素.
>>> os.path.basename("test1/test11.txt") 'test11.txt'
说明:判断文件夹、文件是否存在,返回的是布尔值true
或ffalse
.
# 判断目录 >>> os.path.exists("test1") True # 判断文件 >>> os.path.exists("test.txt") True # 可以判断带路径的文件 >>> os.path.exists("test1/test11.txt") True
这个方法我们是会经常用到的,我给大家举例一下:
# 判断是否存在文件,如不存在则创建一个文件,并写入数据. if filepath = r"E:\Network\Program\python\test\test.txt" if os.path.exists(filepath) == False: with open(filepath, 'w') as f: f.write('hello world.')
说明:判断是否是绝对路径,返回的是布尔值true
或false
.
# 不是绝对路径,返回false >>> os.path.isabs("test1") False # 先查看当前路径 >>> os.getcwd() 'E:\\01 Network\\07 Program\\python\\test' # 绝对路径,返回True >>> os.path.isabs(r"E:\\01 Network\\07 Program\\python\\test") True
说明:判断是否是文件,返回的是布尔值true
或false
.
>>> os.path.isfile("test1/test11.txt") True
说明:判断是否是目录,返回的是布尔值true
或false
.
>>> os.path.isdir("test1") True >>> os.path.isdir("test2") False
说明:将多个路径组合返回一个路径.
>>> os.path.join("test", "test1") 'test\\test1'
说明:返回的是文件内容字符串的长度
# 文件内容写的是:hello world. >>> os.path.getsize("test.txt") 12
说明:可以对目录进行递归,返回的是一个三元组(父目录, 子目录, 文件)
方法walk(top, topdown=True, onerror=None, followlinks=False):
举个小栗子:
try: for root, dirs, files in os.walk(path): print('-' * 50 + "根目录" + '-' * 50) print(root) print('-' * 50 + "目录" + '-' * 50) print(dirs) print('-' * 50 + "文件" + '-' * 50) print(files) except Exception as e: print(e)
运行结果如下所示:
举例一个常用的例子,通过os.walk()
遍历目录,zipfile
压缩打包:
import os import zipfile from datetime import datetime path = r"E:\01 Network\07 Program\python\test\walk" LogTime = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") try: with zipfile.ZipFile(LogTime + ".zip", 'w') as zip: zip_list = [] for root, dirs, files in os.walk(path): for file in files: zip_list.append(os.path.join(root, file)) for dir in dirs: zip_list.append(os.path.join(root, dir)) for i in zip_list: zip.write(i, i.replace(path, '')) except Exception as e: print(e)
运行后结果如下所示:
今天分享python内置模块os
到此就结束了,后期也会连载其他内置模块或第三方模块.
如果大家需要深入研究的请参考官方文档。