os模块的使用方法详解

news2024/11/25 20:14:32

os模块

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;即os模块提供了非常丰富的方法用来处理文件和目录。

使用的时候需要导入该模块:import os

常用方法如下:

方法名

作用

os.remove(‘path/filename’)

删除文件

os.rename(oldname, newname)

重命名文件

os.walk()

生成目录树下的所有文件名

os.chdir('dirname')

改变目录

os.mkdir/makedirs('dirname')

创建目录/多层目录

os.rmdir/removedirs('dirname')

删除目录/多层目录

os.listdir('dirname')

列出指定目录的文件

os.scandir()

和listdir相近的功能,列出指定目录的文件 Python 官方推荐

os.getcwd()

取得当前工作目录

os.chmod()

改变目录权限

os.path.basename(‘path/filename’)

去掉目录路径,返回文件名

os.path.dirname(‘path/filename’)

去掉文件名,返回目录路径

os.path.join(path1[,path2[,...]])

将分离的各部分组合成一个路径名

os.path.split('path')

返回( dirname(), basename())元组

os.path.splitext()

返回 (filename, extension) 元组

os.path.getatime\ctime\mtime

分别返回最近访问、创建、修改时间

os.path.getsize()

返回文件大小

os.path.exists()

是否存在

os.path.isabs()

是否为绝对路径

os.path.isdir()

是否为目录

os.path.isfile()

是否为文件

遍历所有文件及文件夹

获得当前python程序运行路径

import os
print(os.getcwd()) # 输出当前代码所在模块的路径# 
/Users/running/PycharmProjects/chapter04/novel

切换目录到chapter03项目下:

os.chdir('/Users/running/PycharmProjects/chapter03')

查看当前目录下的所有文件和文件夹,并判断是否是文件和文件夹

import os
files = os.listdir()
for file in files:    
    print(file, os.path.isdir(file), 
os.path.isfile(file))

输出结果:

或者使用:

forfileinos.scandir():
     print(file.name, file.path, 
file.is_dir())

可以调用file.stat()获取更加详细的文件信息。如:

其中:

st_size:文件的体积大小(单位:bytes),除以1024就是KB

st_atime:文件的最近访问时间

st_mtime:文件的最近修改时间

st_ctime:Windows下表示创建时间

案例1:

1. 键盘输入一个路径

2. 统计该路径下的文件和文件夹,以及分别的数量

3. 统计当前路径下包含文件名称中包含demo的文件数量,注意不区分大小写

import ospath = input('输入要查询的路径:')
os.chdir(path)
     
file_list = []
dir_list = []
for file inos.scandir():    
     if file.is_dir():        
         dir_list.append(file.name)    
     else:        
         file_list.append(file.name)
print("文件夹的总量是{},\n文件为别为{}".format(len(dir_list),dir_list))
print('{}'.format('-'*30))
     
print("文件总量是{},\n文件为别为{}".format(len(file_list),file_list))
print('{}'.format('-'*30))
     
python_list = []
for name in file_list:    
     if'demo'in name.lower():       
         python_list.append(name)
print('含有python单词的文件数量有{}个,\n文件分别为{}'.format(len(python_list),python_list))

如果要遍历一个目录下的所有子目录,里面指定的文件,我们可以通过递归函数遍历每个目录进行查找或者使用os.walk(),递归实现代码如下:

import os 
import sys
from stat import *


defwalktree(top, callback):for f in os.listdir(top):
        pathname = os.path.join(top, f)
        try: 
            mode = os.stat(pathname, follow_symlinks=False).st_mode
        except:
            continueif S_ISDIR(mode):
            # directory, recurse into it
            walktree(pathname, callback)
        else: 
            # file, whatever type, make the call back function
            callback(pathname)
    returndefprintfile(file):
    print('get to', file)


if __name__ == '__main__':
    if (os.path.isabs(sys.argv[1]) and
        os.path.exists(sys.argv[1])):
        walktree(sys.argv[1], printfile)

Python os模块的walk()函数,顾名思义,就是用来遍历目录树的,此函数可以很方便的遍历以输入的路径为root的所有子目录和其中的文件。

walk函数是一个Python生成器(generator),调用方式是在一个for...in...循环中,walk生成器每次返回的是一个含有3个元素的tuple,分别是 (dirpath, dirnames, filenames)

fordirpath, dirnames, filesinos.walk('./'):
    print(dirpath,dirnames,files)

当然也可以使用glob模块快速实现,假设要获取主目录中所有的mp4文件:

此时使用glob更加方便

import glob
t_list = glob.glob('t*')
print(t_list)  # 获取当前目录下t开头的文件,但是不能获取子文件夹里面的内容

Python的glob还支持**规则(从3.5开始),当**规则与另一个参数recursive=True配合的时候,可以深入的路径的子目录当中去匹配:

glob.glob('**')  # 获取当前目录的文件和文件夹
glob.glob('**/')  # 获取当前目录的文件夹# 如果**结合recursive=True使用,但是如果结合一个*则不能实现递归
glob.glob('**/',recursive=True)  # 可以遍历出所有的子目录# 若要获取子目录中的文件则需要
glob.glob('**/*.mp4',recursive=True) 

案例2:

1. 键盘输入一个路径

2. 搜索该路径下文件大小超过50M的zip文件

3. 搜索该路径下最后修改日期在30天前的文件

4. 打印显示2,3的文件

import os
import datetime
path = input('输入要查询的路径:')
os.chdir(path)

paths = glob.glob('**/*.zip',recursive = True)

forpathin paths:
 file_size = os.stat(path).st_size/1024/1024
 file_modify = datetime.datetime.fromtimestamp(os.stat(path).st_mtime)
 days = (datetime.datetime.now() - file_modify).days
 if (file_size > 50) and (days > 30):
  print('压缩包的路径名称是:{},大小为{:.2f}MB,创建文件年份为:{}'.format(path,file_size,file_build_year))

批量操作文件及文件夹

创建文件夹和多层文件夹

import osifnotos.path.exists('新文件夹名'):
    os.mkdir('新文件夹名')

# 创建多层文件夹
os.makedirs('第一层文件夹/第二层文件夹/第三层文件夹')

复制文件或者文件夹

复制、移动、删除文件夹需要借助另一个模块:shutil模块

# 首先导入模块import shutil
import os

shutil.copy('文件名', '目标文件夹') # 将文件复制到指定文件夹
shutil.copy('文件名', '目标文件夹/新文件名.txt')  # 复制并重命名文件#如果复制的是文件夹
shutil.copytree('源文件夹','目标文件夹')

# 如果不想复制文件而是移动文件,可以使用过move方法 使用方法类似copy,也可以移动文件夹
shutil.move('文件名', '目标文件夹/')
shutil.move('源文件夹','目标文件夹/')  # 文件夹后面记住最后加斜杠/# 若要删除文件夹
shutil.rmtree('文件夹名')
# 删除文件
os.remove('文件名')

案例3:

1. 键盘输入一个路径

2. 获取里面所有的mp4文件

3. 重命名mp4文件在每个文件前面添加前缀,前缀就是文件最后修改的年月日(如:2021-08-18_西游记01.mp4)

4. 新建文件夹:最新视频

5. 将重命名的视频批量移动到最新视频文件夹

import os 
import datetime
import shutil
import glob

path = input('输入要查询的路径:')
os.chdir(path)

ifnotos.path.exists('最新视频'):
 os.mkdir('最新视频')

for dirpath,dirnames,files inos.walk('./'):
    for file inos.scandir(dirpath):
        if file.name.endswith(".mp4"):
            tm = datetime.datetime.fromtimestamp(file.stat().st_mtime)
            new_file = str(tm.year)+'-'+str(tm.month)+'-'+str(tm.day)+'-'+file.name
            os.rename(dirpath +  '/' + file.name,new_file)

file_ls = glob.glob('*.mp4') 
for name in file_ls:
 shutil.move(name,'最新视频/')           
print('over!!!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unidbg模拟执行某段子so实操教程(一) 先把框架搭起来

一、目标 最近又开始研究Unidbg了,费了好大劲,没有跑起来。今天就先找个软柿子捏捏看。 今天的目标是 之前研究的 某段子App签名计算方法(一) 某段子App版本 5.5.10 二、步骤 先搭起框架来 在 /unidbg/unidbg-android/src/test/java/ 下面新建一个 …

K8S 三种探针ReadinessProbe、LivenessProbe和StartupProbe 之探索

一、事件背景因为k8s中采用大量的异步机制,以及多种对象关系设计上的解耦,当应用实例数增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的service、ingress配置总是及时能完成刷新。在一些情况下,往往只是…

Python爬虫之Scrapy框架系列(4)——项目实战【某瓣Top250电影更多信息的获取】

前言: 上篇文章使用Scrapy框架简单爬取并下载了某瓣Top250首页的排名前25个电影的电影名。 太寒酸了,这篇文章咱就来仔细搞一搞,搞到更加详细的信息!!! 目录:1.分析2.使用scrapy shell提取电影详…

进程信号--Linux

文章目录信号?kill -l 指令查看所有信号信号的工作流程信号产生1.通过终端按键产生信号2.通过系统调用接口产生信号3.通过软件产生信号4.硬件异常产生信号信号接收信号处理总结信号? 进程间的通信我们了解到有管道通信,有共享内存的通信。这…

flowable编译

git clone -b flowable-release-6.7.2 https://github.com/flowable/flowable-engine.git下载之后File-Open,打开工程,modules是核心代码模块 找到flowable-root.xml按下altf12 ,启动Terminal终端输入命令:mvn clean package -Ds…

《Buildozer打包实战指南》第三节 安装Buildozer打包所需的依赖文件

目录 3.1 安装依赖软件包 3.2 安装Cython 3.3 设置环境变量 3.4 安装p4a、Android SDK、NDK以及其他编译文件 Buidozer这个打包库下载安装完毕之后,我们还需要下载一些打包安卓apk所需要的依赖文件。 3.1 安装依赖软件包 首先输入以下命令更新Ubuntu上的软件包…

使众人行:如何带领一群人把事做成?

你好,我是雷蓓蓓,一名程序员出身的项目经理,曾任网易杭研项目管理部总监。 我所带领的网易杭研项目管理部,从2011年成立以来,就一直在互联网项目管理领域深耕,为网易云音乐、网易严选、云计算、智慧企业等…

智慧社区管理系统改造方案

伴随着城市发展的持续加速,许多在建智慧社区和老旧小区智能化改造都在有规划的展开着。如今许多老旧小区在展开设备升级,许多小区智能安防设备、物业管理服务系统软件、社区综合服务平台及其监控器设备等都会展开智能化改造。但是,很多人对老…

17.优于select的epoll

优于select的epoll epoll 理解及应用 select复用方法其实由来已久,因此,利用该技术后,无论如何优化程序性能也无法同时接入上百个客户端(当然,硬件性能不同,差别也很大)。这种select方式并不适…

IIC驱动中景园0.96寸OLED

驱动硬件介绍 1、驱动电压3.3到5,但是正点的也是这个芯片说用3.3 5会烧坏掉。 2、RST 上的低电平,将导致OLED 复位,在每次初始化之前,都应该复位一下 OLED 模块。而我们使用四线,里面就没有复位了 3、裸屏有多种接口方式(驱动芯片为SSD1306) 6800、8080 两种并行接口方…

Redis应用2(Redison)

不推荐使用application的配置方式,因为会替代spring内部的对于redis的配置方式 注意:如果redis数据库没有密码,不要使用 config.useSingleServer().setPassword("") 的形式,直接跳过setPassword()就可以,配置类写法如下: Configuration public class RedisConfig…

MySQL进阶——索引

一、索引及其分类 1.索引的概念 索引是一种特殊的文件,包含着对数据表中所有记录的引用指针通俗点说,索引就好比是一本书的目录,能加快数据库的查询速度例如需要遍历 200 条数据,在没有索引的情况下,数据库会遍历全部…

Spring之事务编程概述

目录 一:基本概念 搭建测试环境 基于xml声明式事务控制 二:事务相关配置 ​编辑 基于注解声明式事务控制 三:Spring事务角色 四:事务传播行为 五:案例:转账业务追加日志 一:基本概念 事…

Vue.nextTick核心原理

相信大家在写vue项目的时候,一定会发现一个神奇的api,Vue.nextTick。为什么说它神奇呢,那是因为在你做某些操作不生效时,将操作写在Vue.nextTick内,就神奇的生效了。那这是什么原因呢? 让我们一起来研究一…

手把手教你写Dockerfile以及测试

Dockerfile是什么? dockerfile就是用来构建docker镜像的构建文件,命令参数脚本。 如何使用Dockerfile? 1、编写一个Dockerfile文件2、docker build构建成 基础使用(此处罗列一些我们经常用到的) # 指定依赖镜像版本&#xff…

【附代码】十大主流聚类算法

准备工作安装必要的库pip install scikit-learn准备数据集使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据&#xff0c…

第18章_JDBC

一、JDBC概述JDBC概述什么是JDBCJDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成有了JDBC,程序员只需用JDBC API写一个…

夜深忽梦少年事,7年又一年,来看看95年那个小伙现在怎么样了

2022年已到尾声,疫情也结束了,这三年太不容易了,今年也是一样在疫情的艰难的度过,就是做了两件事,防疫和上班,没什么可写的。但是在一个深夜晚上,想了很多以前的事,想想还是写一点东…

亚马逊云科技Amazon DeepRacer互联网行业全国冠军诞生

1月11日,首届亚马逊云科技Amazon DeepRacer自动驾驶赛车互联网行业全国总决赛圆满结束,从全国各地选拔出的9支冠军队伍齐聚滨海三亚,向总决赛的桂冠发起了冲击。 本次比赛沿袭了Amazon DeepRacer League全球赛事标准,使用了全新的…

Vue.js的this如何取到data和method里的属性?

本篇文章介绍的是Vue.js如何取到data和methods里的属性? 准备工作 克隆源码到本地 git clone https://github.com/vuejs/vue.git 下载完毕后,用vscode打开,目光移动到package.json的scripts属性,我们看到有dev和build&#xff0…