乐趣区

关于python:os模块的使用方法详解

os 模块 os 模块负责程序与操作系统的交互,提供了拜访操作系统底层的接口;即 os 模块提供了十分丰盛的办法用来解决文件和目录。

应用的时候须要导入该模块:import os

罕用办法如下:办法名作用

遍历所有文件及文件夹

取得以后 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 就是 KBst_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!!!')
退出移动版