查看原文
其他

Python管理文件神器 os.walk

点击上方 "Python人工智能技术关注,星标或者置顶
22点24分准时推送,第一时间送达
后台回复“大礼包”,送你特别福利

编辑:乐乐 | 来自诡途 

链接:blog.csdn.net/qq_35866846/article/details/107823636

Pythn人工智能技术(ID:coder_experience)第677期推文

上一篇:Python 正则表达式大全


正文


大家好,我是Python人工智能技术

【导语】:有没有想过用python写一个文件管理程序?听起来似乎没思路?其实是可以的,因为Python已经为你准备好了神器os.walk,进来看看吧!



Python中os.walk是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。


本文将详细介绍os.walk模块,最后使用os.walk模块实现一个在指定日志整理文件的程序。

1、基本介绍

os.walk():扫描某个指定目录下所包含的子目录和文件,返回的是一个迭代器。

2、基本使用

假设文件夹data有如下的目录结构(cmd 命令:tree /f)



2.1扫描所有文件


扫描内容:


  • 子文件夹和文件

  • 子文件夹下的文件


输出内容:


  • 文件夹名称/文件名称


扫描路径:


  • 自顶向下 topdown=True(默认)

  • 自底向上 topdown=False


from os import walkpath="data"for curDir, dirs, files in walk(path):#for curDir, dirs, files in walk(path,topdown=False): print("现在的目录:" ,curDir) print("该目录下包含的子目录:" , str(dirs)) print("该目录下包含的文件:",str(files))    print("*"*20)


自顶向下扫描结果:


现在的目录:data该目录下包含的子目录:['testA', 'testB', 'testC']该目录下包含的文件:['2020-07-12 - 第一层.xlsx', '2020-07-13 - 第一层.xlsx', '2020-07-14 - 第一层.xlsx']********************现在的目录:data\testA该目录下包含的子目录:[]该目录下包含的文件:['2020-07-12-A.xlsx', '2020-07-13-A.xlsx', '2020-07-14-A.xlsx']********************现在的目录:data\testB该目录下包含的子目录:[]该目录下包含的文件:['2020-07-12-B.xlsx', '2020-07-13-B.xlsx', '2020-07-14-B.xlsx']********************现在的目录:data\testC该目录下包含的子目录:[]该目录下包含的文件:['2020-07-12-C.xlsx', '2020-07-13-C.xlsx', '2020-07-14-C.xlsx']********************


自底向上扫描结果:


现在的目录:data\testA该目录下包含的子目录:[]该目录下包含的文件:['2020-07-12-A.xlsx', '2020-07-13-A.xlsx', '2020-07-14-A.xlsx']********************现在的目录:data\testB该目录下包含的子目录:[]该目录下包含的文件:['2020-07-12-B.xlsx', '2020-07-13-B.xlsx', '2020-07-14-B.xlsx']********************现在的目录:data\testC该目录下包含的子目录:[]该目录下包含的文件:['2020-07-12-C.xlsx', '2020-07-13-C.xlsx', '2020-07-14-C.xlsx']********************现在的目录:data该目录下包含的子目录:['testA', 'testB', 'testC']该目录下包含的文件:['2020-07-12 - 第一层.xlsx', '2020-07-13 - 第一层.xlsx', '2020-07-14 - 第一层.xlsx']********************



2.2扫描输出所有文件的路径


输出所有文件:


import ospath="data"for curDir, dirs, files in os.walk(path): for file in files:        print(os.path.join(curDir, file))
data\2020-07-12 - 第一层.xlsxdata\2020-07-13 - 第一层.xlsxdata\2020-07-14 - 第一层.xlsxdata\testA\2020-07-12-A.xlsxdata\testA\2020-07-13-A.xlsxdata\testA\2020-07-14-A.xlsxdata\testB\2020-07-12-B.xlsxdata\testB\2020-07-13-B.xlsxdata\testB\2020-07-14-B.xlsxdata\testC\2020-07-12-C.xlsxdata\testC\2020-07-13-C.xlsxdata\testC\2020-07-14-C.xlsx


输出指定类型文件


#endswith 截取文件后缀import ospath="data"for curDir, dirs, files in os.walk(path):    [print(os.path.join(curDir, file)) for file in files  if file.endswith(".xlsx")]


2.3扫描输出所有的子目录(子文件夹)


# 使用os.walk输出某个目录下的所有文件import ospath="data"for curDir, dirs, files in os.walk(path): for _dir in dirs:        print(os.path.join(curDir, _dir))
data\testAdata\testBdata\testC


案例代码


#综合运用os.walk()——文件指定日期整理程序


另外搜索公众号编程技术圈回复关键字"Python”获取一份惊喜礼包。


import pandas as pdimport numpy as npimport os,openpyxl#移动符合条件文件,并删除二级文件夹和多余文件def move_file(file_path,_new_path,date_xl_str):
#本月文件移动至对应新建文件夹,非本月文件直接删除 for curDir, dirs, files in os.walk(file_path): for file in files: old_path = os.path.join(curDir, file) new_path = os.path.join(_new_path, file) file_date=file.split("_")[-1][:10] try: os.rename(old_path,new_path) if file_date in date_xl_str else os.remove(old_path) except: os.remove(old_path)
#移除子文件夹 for curDir, dirs, files in os.walk(file_path): for _dir in dirs: os.removedirs(os.path.join(curDir, _dir)) os.mkdir("data")
#文件去重-相同日期文件def qch_date(file_path): wj_names=os.listdir(file_path) wj_list=[] num=0 for wj in wj_names: new_wj=wj[:-11] if new_wj not in wj_list: wj_list.append(new_wj) else: os.remove(file_path+"\\"+wj) num+=1 return num
#更新数据源def refresh_data(file_path,sheet_name,data): book=openpyxl.load_workbook(file_path) writer=pd.ExcelWriter(file_path,engine="openpyxl")
#在ExcelWriter的源代码中,它初始化空工作簿并删除所有工作表, #writer.book = book将原来表里面的内容保存到writer中 writer.book=book
#activate激活指定sheet工作表 ws=book[sheet_name]
#清空当前活动表数据 for row in ws.iter_rows(): for cell in row: cell.value=None
#dataframe行列数 idx_num,col_num=data.shape
#新数据写入当前活动表-注意索引偏移 for i in range(1,idx_num+1): for j in range(1,col_num+1): ws.cell(row=i,column=j).value=data.iloc[i-1,j-1]
#保存关闭writer writer.save() writer.close()
return None
#文件检查def check_file(file_path,check_file="文件检查.xlsx"): wj_names=os.listdir(file_path) data=pd.DataFrame([wj.split("_")[2:] for wj in wj_names],columns=["店铺名称","日期"]) data['日期']=data['日期'].str[:10]
    #标题columns放到dataframe中 nind=data.index.insert(0,'0') data1=data.reindex(index=nind) data1.loc['0']=data.columns data1.reset_index(drop=True,inplace=True)
#刷新数据源 refresh_data(check_file,"数据源",data1)
return None
file_path="data"#日期格式:xxxx-xx eg:2020-07-01start_date=input("请输入开始日期:")end_date=input("请输入开始日期:")
#生成日期区间-字符串类型date_xl_str=[str(i)[:10] for i in pd.date_range(start_date,end_date,freq='D')]
#创建指定文件夹new_path=start_date+"~"+end_datetry: os.mkdir(new_path)except: print("文件夹 【%s】 已存在"%new_path)
#移动符合条件文件,并删除二级文件夹和多余文件move_file(file_path,new_path,date_xl_str)
#文件去重num=qch_date(new_path)print("去除重复文件 %s 个"%num)
#文件检查check_file(new_path)

你还有什么想要补充的吗?

免责声明:本文内容来源于网络,文章版权归原作者所有,意在传播相关技术知识&行业趋势,供大家学习交流,若涉及作品版权问题,请联系删除或授权事宜。


技术君个人微信


添加技术君个人微信即送一份惊喜大礼包


→ 技术资料共享

→ 技术交流社群



--END--


往日热文:

神器!微软发布 Python 的 JIT 编译器:Pyjion!

大学生上“暗网”发现“财富密码”,结果…

985高校副教授一年能够拿到多少工资?

真的,我现在特讨厌 Safari 浏览器

深入理解Python 5个硬核函数!


Python程序员深度学习的“四大名著”:



这四本书着实很不错!我们都知道现在机器学习、深度学习的资料太多了,面对海量资源,往往陷入到“无从下手”的困惑出境。而且并非所有的书籍都是优质资源,浪费大量的时间是得不偿失的。给大家推荐这几本好书并做简单介绍。


获得方式:

1.扫码关注本公众号
2.后台回复关键词:名著

▲长按扫描关注,回复名著即可获取

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存