Python基础学习之 os 模块详解

Python基础学习之 os 模块详解

文章目录


os模块的作用可以分为三类:路径操作,文件操作,其他操作;

1. 路径操作

1.1 os.chdir(),切换当前工作目录;

os.chdir(r'D:\测试文件夹')     # 将工作目录切换为:D:\测试文件夹

1.2 os.getcwd(),返回工作目录路径;

print(os.getcwd())    # 输出:D:\PY_useful\3_python 基础,就是当前.py文件所在的位置;
os.chdir(r'D:\测试文件夹')    # 切换工作目录
print(os.getcwd())    # 返回当前程序所在的路径   输出:D:\测试文件夹;

1.3 os.mkdir() & os.makedirs(),创建目录;

os.mkdir() :创建目录,只可以一级一级的创建目录;
os.makedirs() :创建多级目录,即前一级的文件夹不存在,也可以创建;

os.mkdir(r'D:\PY_useful\python建目录')
# 创建目录,只可以一级一级的创建目录,前提是 D:\PY_useful\ 已经存在,不然会报错;作用是:可以防止创建双层或者多层错误路径;
# 如果PY_useful 文件夹不存在,则会报错;

os.makedirs(r'D:\PY_useful\python建目录\一级\二级')    # 创建多级目录,即前一级的文件夹不存在,也不会报错;哪怕中间目录不存在也能正常的创建;

1.4 os.rmdir() & os.rmdirs(),删除目录;

os.rmdir()(r'D:\PY_useful\python建目录')# 删除目录
os.rmdirs(r'D:\PY_useful\python建目录\一级\二级')    # 删除多级目录

1.5 os.listdir(path=…) ,返回指定文件夹下所有的文件和文件夹

使用 os.listdir(path=…) ,可以查看一层的内容;举例如下:

os.listdir(path=r'D:\测试文件夹')    # ['一层文件.txt', '一层文件2.txt', '一层文件夹']

1.6 os.walk(path=…) ,遍历目录,返回一个元组 (root,dirs,files);

每次遍历的对象都是返回的是一个三元组(root,dirs,files),其中:

  1. root 所指的是当前正在遍历的这个文件夹的本身的地址;
  2. dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录);
  3. files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录);

os.walk(path=…) 一般的用法如下:

for root, dirs, files in os.walk(r'D:\测试文件夹'):
    print('当前文件夹:' + root)    # 返回当前的文件夹地址;

    print('本层包含的文件夹:')    
    for name in dirs:      # 遍历文件夹中的文件夹;
        print(os.path.join(root, name))    # 利用os.path.join(root, name),返回一个完整的文件夹路径;

    print('本层包含的文件:')
    for name in files:      # 遍历文件夹中的文件;
        print(os.path.join(root, name))    # 利用os.path.join(root, name),返回一个完整的文件路径;

    print('')   # 循环一次则输出一个空行;方便区分;

在这里插入图片描述

本章内容中的文件夹结构;参考上图

输出:

当前文件夹:D:\测试文件夹
本层包含的文件夹:
D:\测试文件夹\一层文件夹
本层包含的文件:
D:\测试文件夹\一层文件.txt
D:\测试文件夹\一层文件2.txt

当前文件夹:D:\测试文件夹\一层文件夹
本层包含的文件夹:
D:\测试文件夹\一层文件夹\二层文件夹
D:\测试文件夹\一层文件夹\二层文件夹--2
本层包含的文件:
D:\测试文件夹\一层文件夹\二层文件.txt
D:\测试文件夹\一层文件夹\二层文件2.txt

当前文件夹:D:\测试文件夹\一层文件夹\二层文件夹
本层包含的文件夹:
D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹
本层包含的文件:
D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt

当前文件夹:D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹
本层包含的文件夹:
本层包含的文件:

当前文件夹:D:\测试文件夹\一层文件夹\二层文件夹--2
本层包含的文件夹:
本层包含的文件:
D:\测试文件夹\一层文件夹\二层文件夹--2\三层文件----2.txt

1.7 os.path.isdir(), 判断是否为目录;

print(os.path.isdir('D:\测试文件夹\一层文件夹\二层文件夹'))    # 是文件夹,则输出:True
print(os.path.isdir('D:\测试文件夹\一层文件.txt'))    # 不是文件夹,则输出:False

1.8 os.path.isabs(path),判断是否为绝对路径;

os.path.isabs('D:\测试文件夹\一层文件夹\二层文件夹') # 是绝对路径,则输出:True

1.9 os.rename(src, dst),修改文件夹名称;

其中:src – 要修改的目录名;dst – 修改后的目录名;举例如下:

os.rename('D:\测试文件夹\一层文件夹','D:\测试文件夹\一层文件夹_改')   # 执行语句后,文件夹名称变为:一层文件夹_改;

在这里插入图片描述

2. 文件操作

2.1 os.remove(path) ,删除一个文件

os.remove('D:\测试文件夹\一层文件.txt')  # 删除文件;

2.2 os.path.abspath(),返回文件的绝对路径

2.3 os.path.join(),路径拼接;非常常用的函数,必须要熟练掌握;

连接两个或更多的路径名组件,在前面的 1.6 中已经使用;注意以下三点:

  1. 如果各组件名开头不包含’/’,则函数会自动加上;
  2. 如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃;
  3. 如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾;
    举例如下:
a = os.path.join('D:\\','测试文件夹','一层文件2.txt')
print(a)    # D:\测试文件夹\一层文件2.txt
a = os.path.join('D:\\','测试文件夹','')
print(a)    # D:\测试文件夹\  ,这里因为最后有一个空字符串,所以路径以’/’分隔符结尾

2.4 os.path.dirname(path),去掉文件名,返回目录

a = os.path.dirname('D:\测试文件夹\一层文件夹\二层文件夹--2\三层文件----2.txt')
print(a)    # 输出: D:\测试文件夹\一层文件夹\二层文件夹--2

2.5 os.path.splitext(),将扩展名与前面的路径分开;返回元组类型;

# os.path.splitext()
a = os.path.splitext('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')
print(a)    # 输出元组:('D:\\测试文件夹\\一层文件夹\\二层文件夹\\三层文件', '.txt')
print(a[0])    # 输出:D:\测试文件夹\一层文件夹\二层文件夹\三层文件
print(a[1])    # 输出:.txt

2.6 os.path.basename(),返回文件名;

a = os.path.basename('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')
print(a)  # 三层文件.txt

2.7 os.path.exists(),检查字符串是不是路径;返回布尔类型;

是路径,则返回True, 否则返回False;

a = os.path.exists('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')
print(a)    # True

2.8 os.path.isfile(),检查字符串是不是文件;返回布尔类型;

# os.path.isfile()
a = os.path.isfile('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')
print(a)

2.9 os.path.getsize(),返回文件大小;

# os.path.getsize()
a= os.path.getsize('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')
print(a)

2.10 os.open() & os.close(),文件读取和关闭;

这里的两个方法,不常用;打开文件一般使用 open() 方法;

os.open() # 用于文件读取;
os.close()  # 用于文件关闭;

2.11 os.path.getatime() & os.path.getmtime() , 文件的最后存取时间 & 最后修改时间;

import time
a = os.path.getatime('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')  # 返回path所指向的文件或者目录的最后存取时间,得到的是时间戳
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(a)))    # 将时间戳变为格式化字符串;输出:2020-09-25 11:06:21

a=os.path.getmtime('D:\测试文件夹\一层文件夹\二层文件夹\三层文件.txt')  # 返回path所指向的文件或者目录的最后修改时间,得到的是时间戳
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(a)))    # 将时间戳变为格式化字符串;输出:2020-09-25 11:06:21

上面时间戳变为可视化字符串的方法,可以参考:Python基础学习之时间模块 time模块 datetime模块

3. 其他操作

3.1 os.system(command) , 相当于执行对应指令(command)

os.system(r'D:\print_fun.py')    # 执行对应地址的.py 文件,在定期运行程序时,会经常用到这个方法;

3.2 os.name,可以得到操作系统的类型;

只有三个返回值,分别为:posix , nt , java, 对应linux / windows / java虚拟机

os.name     # 输出:nt; 

3.3 os.sep,可以得到操作系统特定的路径分隔符;

Windows 系统分隔符为:\ ; Linux 系统分隔符为:/ ;当程序需要在不同系统运行时,通常会用到该属性;

os.sep      # 输出:\; 操作系统特定的路径分隔符,Linux 系统返回 /, Windows 返回 \;

3.4 os.linesep,可以可到操作系统的行终止符;

不同系统的终止符:Windows使用 ‘\r\n’,Linux使用 ‘\n’ , Mac使用 ‘\r’ 。

os.linesep    # 字符串给出当前平台使用的行终止符。

4. 实例

4.1 固定时间运行程序

每隔10分钟,运行一次程序;

import time,os

def sleep_time(hour,min,sec):
    return hour * 3600 + min * 30 +sec

sleep = sleep_time(0,10,0)
while True:
    time.sleep(sleep)
    print('开始执行;')
    print('现在时间为:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(a)))
    os.system(r'D:\print_fun.py')
    print('执行完成;')

每天早上 7:00 运行程序;

import time, os

while True:
    time_now = time.strftime("%H:%M", time.localtime())
    if time_now == '07:00':
        print('开始执行;')
        print('现在时间为:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        os.system(r'D:\print_fun.py')
        print('执行完成;')
        time.sleep(60)  # 因为我们是以分钟作为匹配值的,所以程序运行后,延时60s,确保程序不重复执行;

4.2 寻找文件中的特定字符

寻找制定文件夹下(这里是:测试文件夹)下,Excel 文件内容包含字符串 ‘小可爱’ 的文件,并打印出文件名 & sheet 名;

在这里插入图片描述
备注:测试文件夹的目录见上图,其中两个excel 文件的sheet1 & sheet2 均写了字符串如下字符串,参考下图:
在这里插入图片描述
在这里插入图片描述

import re
import pandas as pd

def func(folder_dir=r'',file_name=''):
    '''
    :param folder_dir: 需要被寻找的文件夹路径
    :param file_name: 被寻找的特殊字段,必须是xlsx文件
    :return: 打印出特殊字段所在的文件路径
    '''
    xmlRegex = re.compile(r'.*?.(xlsx|xls)', re.I)  #
    oldDocDir=folder_dir
    os.chdir(oldDocDir)
    for foldername, subfolders, filenames in os.walk(oldDocDir):
        for filename in filenames:
            # absdir = os.path.abspath('.')
            if xmlRegex.findall(str(filename)):
                try:
                    oldName = os.path.join(foldername, filename)
                    info = pd.read_excel(oldName, sheet_name=None)   # sheet_name = None 则会读所有的sheet;
                    for key,value in info.items():
                        if file_name in value.to_string():
                            print(file_name,'在文件:',oldName,end='  ')
                            print('的',key,'中')
                except :
                    print(oldName,'--> 这个文件我读不了呀~~请注意!')


func(r'D:\测试文件夹',r'小可爱')    # 调用函数,传入两个参数:需要寻找的目录 & 需要寻找的字符;

输出: 我们可以看到,两个文件中的四个 ‘小可爱’ 都被找到了;在日常工作中,这可以大大节省时间,提高工作效率;

小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件.xlsx  的: Sheet1 中
小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件.xlsx  的: Sheet2 中
小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹\四层文件.xlsx  的: Sheet1 中
小可爱 在文件: D:\测试文件夹\一层文件夹\二层文件夹\三层文件夹\四层文件.xlsx  的: Sheet2 中

猜你喜欢

转载自blog.csdn.net/weixin_47139649/article/details/108793009