os模块
os模块:
功能: 与操作系统交互的作用,允许你执行如文件和目录操作、执行命令、处理路径名称等操作。
参数与说明
- os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") # 改变当前脚本工作目录,相当于shell下cd命令
- os.curdir # 返回当前目录: ('.')
- os.pardir # 获取当前目录的父目录字符串名: ('..')
- os.makedirs('dirname1/dirname2') # 可生成多层递归目录
- os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依次类推
- os.mkdir('dirname') # 生成单级目录, 相当于shell中mkdir dirname
- os.rmdir('dirname') # 删除单级目录,若目录不会空则无法删除,报错:相当于shell中rmdir dirname
- os.listdir('dirname') # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.walk(path) # 一个遍历目录数的函数,它以一种深度优先的策略(depth-first)访问指定的目录。
- os.getlogin() # 获取在进程的控制终端上登录的用户名称(即此时pc登录的用户名)
- os.remove() # 删除一个文件
- os.rename('oldname', 'newname') # 重命名文件/目录
- os.stat('path/filename') # 获取文件/目录信息
- os.sep # 输出操作系统特定的路径分割符, win下为"\\" , linux下为"/"
- os.linesep # 输出当前平台使用的行终止符, win下为"\t\n", linux下为"\n"
- os.system("bash command") # 运行shell命令,直接显示
- os.environ # 获取系统环境变量
- os.path.abspath(path) # 返回path规范化的绝对路径
- os.path.split(path) # 将path分割成目录和文件名二元组返回
- os.path.dirname(path) # 返回path的目录,其实就是os.path.split(path)的第一个元素
- os.path.basename(path) # 返回path最后的文件名,如果path以/或\结尾,那么就会返回空值,
- os.path.exists(path) # 如果path存在,返回True,如果path不存在,则返回False
- os.path.isfile(path) # 检查路径是否为文件
- os.path.isdir(path) # 检查路径是否为目录
- os.path.islink(path) # 检查路径是否是一个符号链接
- os.path.join(path1[, path2[,....]]) # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
- os.path.getatime(path) # 返回path所指向的文件或者目录的最后访问时间
- os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间
- os.path.getsize(path) # 返回path的大小
查询登录用户 os.getlogin
user = os.getlogin()
print(user)
# 打印结果:test
1.路径操作
1.1.os.getcwd()
获取当前工作目录路径
import os
dir = os.getcwd()
print(dir)
# 打印结果: E:\BaiduSyncdisk\NewProject\Chen\Day14
1.2.os.chdir()
切换当前工作目录
import os
os.chdir("D:\\")
1.3.os.mkdir()
创建文件夹,不指定路径,默认当前目录下创建
import os
os.mkdir('osdirname')
1.4.os.makedirs()
递归创建文件夹,不指定路径,默认当前目录下创建
import os
os.makedirs("osdir/dir1")
1.5.os.rmdir()
删除指定文件目录,不指定路径,默认当前目录下删除
import os
os.rmdir("dirname")
1.6.os.removedirs() (谨慎使用)
若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依次类推
import os
os.removedirs("dirname")
1.7.os.listdir()
列出指定目录下的所有文件和子目录,但不会打印二级目录
import os
listdir = os.listdir("E:\BaiduSyncdisk\\NewProject\Chen\Day14")
print(listdir)
# 打印结果:['2.OS模块.py', '1.编码历史.py', '2.os系统模块.py', 'log_func.log', 'osdir', 'osdirname', 'test.txt']
1.8 os.walk()
语法:os.walk(top=path,topdown=True,oneerror=None)
参数top
表示需要遍历的目录树的路径。
参数topdown
默认为 True ,表示首先返回根目录树下的文件,然后,再遍历目录树的子目录。 当topdown 的值为 False 时,则表示先遍历目录树的子目录,返回子目录下的文件,最后返回根目录下的文件。
参数oneerror
的默认值为 None ,表示忽略文件遍历时产生的错误;如果不为空,则提供一个自定义函数提示错误信息,后边遍历抛出异常。
os.walk() 函数的返回值是一个生成器(generator),每次遍历的对象都是返回的是一个三元组 (root,dirs,files):该元组有3个元素,这3个元素分别表示每次遍历的路径名,目录列表和文件列表。
import os
from os.path import join
home_path = "/home"
for (root, dirs, files) in os.walk(home_path):
for dirname in dirs:
print(join(root, dirname))
for file in files:
print(join(root, file))
win下获取目录和目录路径
import os
def walk(path):
if not os.path.exists(path):
return -1
for root, dirs, files in os.walk(path):
for filename in files:
print(os.path.join(root, filename)) # 路径和文件名连接构成完整路径
path = 'E:\BaiduSyncdisk\\NewProject\Chen'
walk(path)
1.8.os.rename()
重命名目录名
import os
os.rename("olddirname", "newdirname")
2.文件操作
2.1.os.remove()
删除指定文件,不指定路径,默认当前目录下
import os
os.remove("filename")
2.2.os.rename()
重命名文件名
import os
os.rename("oldfilename", "newfilename")
2.3.os.stat()
获取某个文件的信息,例如:文件大小、上一次访问时间、上一次修改时间等
file_info = os.stat("logs.log")
print(file_info)
# 打印结果:
# os.stat_result(st_mode=33206, st_ino=6473924464355053, st_dev=3458564078,
# st_nlink=1, st_uid=0, st_gid=0, st_size=447, st_atime=1715348276, st_mtime=1715177483, st_ctime=1715342203)
# 获取文件大小
print(file_info.st_size)
# 447
# 获取文件修改时间,可以通过time.ctime转换时间
import time
print(time.ctime(file_info.st_mtime))
# Wed May 8 22:11:23 2024
3.环境变量
3.1.os.environ
获取所有环境变量
import os
env_path = os.environ
print(env_path)
"""
environ({'ADSK_CLM_WPAD_PROXY_CHECK': 'FALSE', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'MS-NZVNVIUFWRCD', 'COMSPEC': 'C:\\windows\\system32\\cmd.exe'...})
"""
获取指定环境变量
env_path = os.environ.get("ENVNAME")
print(env_path)
4.执行命令
4.1.os.system()
执行系统命令
# 执行命令并等待命令完成
return_code = os.system('ls -l')
# 检查命令是否成功执行(返回为0通常表示成功)
if return_code == 0:
print("Command executed scuccessfully!")
5.进程管理
5.1.os.exit()
退出程序
os.exit()
6.文件操作
6.1.os.close()
关闭文件
# 打开文件
fp = os.open("filename")
# 关闭文件
os.close(fb)
7.os.path模块
7.1.os.path.abspath()
返回路径的绝对路径。
注意:如果 os.path.abspath(.) 存在与已被定义的方法中,则返回的绝对路径是调用该方法的模块的绝对路径,而不是方法的绝对路径。
import os
path = os.path.abspath("logs.log")
print(path)
# 打印结果: E:\BaiduSyncdisk\NewProject\Chen\Day14\logs.log
7.2.os.path.dirname
返回路径中的目录名。它去掉路径中的文件名,返回剩余的部分。
import os
path = os.path.dirname("E:\BaiduSyncdisk\\NewProject\Chen\Day14\logs.log")
print(path)
# E:\BaiduSyncdisk\NewProject\Chen\Day14
7.3.os.path.split()
将路径分割成目录和文件名两部分,返回一个元组 (dirname, basename)。
path = os.path.split("E:\BaiduSyncdisk\\NewProject\Chen\Day14\logs.log")
print(file)
# 打印结果:('E:\\BaiduSyncdisk\\NewProject\\Chen\\Day14', 'logs.log')
7.4.os.path.basename()
获取文件名称
import os
path = os.path.basename("E:\BaiduSyncdisk\\NewProject\Chen\Day14\logs.log")
print(path)
# 打印结果: logs.log
7.5.os.path.join()
连接一个或多个路径组件,返回一个组合后的路径。它会根据操作系统使用适当的路径分隔符。
import os
path = os.path.join("E:\BaiduSyncdisk\\NewProject\Chen", "\Day14\logs.log")
print(path)
# 打印结果: E:\Day14\logs.log
7.6.os.path.getsize()
获取文件大小
file_size = os.path.getsize("logs.log")
print(file_size)
# 打印结果: 447
7.7.os.path.getsize()
获取文件修改访问日期
import os
import time
file_atime = os.path.getatime("logs.log")
print(time.ctime(file_atime))
# 打印结果: Fri May 10 21:37:56 2024
8.应有示例
- 编写一个脚本,用于将当前目录下的所有
.txt
文件复制到一个新的目录中
import os
# 定义目标目录
target_directory = '/path/to/target'
# 遍历当前目录下的所有文件
for filename in os.listdir('.'):
if filename.endswith('.txt'):
# 构造完整的源文件和目标文件路径
source_path = os.path.join(os.getcwd(), filename)
target_path = os.path.join(target_directory, filename)
# 复制文件
os.system(f"cp {source_path} {target_path}")
# 重命名或移动文件
# os.rename('/path/to/old_name', '/path/to/new_name')
使用 os.listdir() 获取当前目录下的所有文件和目录列表,然后检查每个文件名是否以 .txt 结尾。对于每个文本文件,我们使用 os.path.join() 构造完整的路径,并使用 os.system() 调用 cp 命令来复制文件。
2.编写一个脚本,用于将当前目录下的所有.py
文件复制到一个新目录中
import os
import shutil
# 定义源目录和目标目录
source_dir = os.getcwd()
target_dir = "/path/to/target"
# 遍历当前目录下的所有文件
for filename in os.listdir(source_dir):
if filename.endswith(".py"):
# 构建完整的源文件和目标文件路径
source_file = os.path.join(source_dir, filename)
target_file = os.path.join(target_dir, filename)
# 复制文件
os.path.isfile(target_file) and os.remove(target_file) # 删除已存在的文件
# os.copy()函数用不了的情况下,可以使用以下方式
# 方法一:通过系统命令执行复制操作
os.system(f"cp {source_file} {target_file}")
# 方法二:通过shutil模块去操作复制文件
shutil.copy(source_file, target_file)
3.在自动化测试过程中,常常需要发送邮件,将最新的测试报告文档发送给相关人员查看,所以就需要查找最新文件的功能。
举例:查找文件夹下最新的文件。
import os
def new_file(dir):
# 列举dir目录下的所有文件(名),结果以列表形式返回。
lista = os.listdir(dir)
# sort按key的关键字进行升序排序,lambda的入参fn为lists列表的元素,获取文件的最后修改时间,所以最终以文件时间从小到大排序
# 最后对lists元素,按文件修改时间大小从小到大排序。
lista.sort(key=lambda fn:os.path.getmtime(dir+'\\'+fn))
# 获取最新文件的绝对路径,列表中最后一个值,文件夹+文件名
file_path = os.path.join(dir, lista[-1])
return file_path
print(new_file("E:\BaiduSyncdisk\\NewProject\Chen\Day14"))
# E:\BaiduSyncdisk\NewProject\Chen\Day14\2.OS模块.py