Python OS 文件管理
python中 os.walk 是一个简单易用的文件、目录遍历器,可以高效的处理文件、目录方面的事情。最后使用os.walk模块实现一个在指定日志整理文件的程序。

基本介绍

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

基本使用

假设文件夹data有如下的目录结构(cmd 命令:tree /f )
Python-文件管理OS.walk模块 - 图1

2.1扫描所有文件

扫描内容:

  • 子文件夹和文件
  • 子文件夹下的文件

输出内容:

  • 文件夹名称/文件名称

扫描路径:

  • 自顶向下 topdown=True (默认)
  • 自底向上 topdown=False
    1. from os import walk
    2. path="data"
    3. for curDir, dirs, files in walk(path):
    4. #for curDir, dirs, files in walk(path,topdown=False):
    5. print("现在的目录:" ,curDir)
    6. print("该目录下包含的子目录:" , str(dirs))
    7. print("该目录下包含的文件:",str(files))
    8. 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’]


  1. 自底向上扫描结果:

现在的目录: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’]


  1. <a name="573f7087fc14ea4b970a0342c561e989"></a>
  2. #### 2.2扫描输出所有文件的路径
  3. <a name="06fd3abdad31f991ef3f5ca1d3f332c9"></a>
  4. ##### 输出所有文件
  5. ```python
  6. import os
  7. path="data"
  8. for curDir, dirs, files in os.walk(path):
  9. for file in files:
  10. print(os.path.join(curDir, file))
  1. data\2020-07-12 - 第一层.xlsx
  2. data\2020-07-13 - 第一层.xlsx
  3. data\2020-07-14 - 第一层.xlsx
  4. data\testA\2020-07-12-A.xlsx
  5. data\testA\2020-07-13-A.xlsx
  6. data\testA\2020-07-14-A.xlsx
  7. data\testB\2020-07-12-B.xlsx
  8. data\testB\2020-07-13-B.xlsx
  9. data\testB\2020-07-14-B.xlsx
  10. data\testC\2020-07-12-C.xlsx
  11. data\testC\2020-07-13-C.xlsx
  12. data\testC\2020-07-14-C.xlsx

输出指定类型文件
  1. #endswith 截取文件后缀
  2. import os
  3. path="data"
  4. for curDir, dirs, files in os.walk(path):
  5. [print(os.path.join(curDir, file)) for file in files if file.endswith(".xlsx")]

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

  1. # 使用os.walk输出某个目录下的所有文件
  2. import os
  3. path="data"
  4. for curDir, dirs, files in os.walk(path):
  5. for _dir in dirs:
  6. print(os.path.join(curDir, _dir))
  1. data\testA
  2. data\testB
  3. data\testC

案例代码

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

  1. import pandas as pd
  2. import numpy as np
  3. import os,openpyxl
  4. #移动符合条件文件,并删除二级文件夹和多余文件
  5. def move_file(file_path,_new_path,date_xl_str):
  6. #本月文件移动至对应新建文件夹,非本月文件直接删除
  7. for curDir, dirs, files in os.walk(file_path):
  8. for file in files:
  9. old_path = os.path.join(curDir, file)
  10. new_path = os.path.join(_new_path, file)
  11. file_date=file.split("_")[-1][:10]
  12. try:
  13. os.rename(old_path,new_path) if file_date in date_xl_str else os.remove(old_path)
  14. except:
  15. os.remove(old_path)
  16. #移除子文件夹
  17. for curDir, dirs, files in os.walk(file_path):
  18. for _dir in dirs:
  19. os.removedirs(os.path.join(curDir, _dir))
  20. os.mkdir("data")
  21. #文件去重-相同日期文件
  22. def qch_date(file_path):
  23. wj_names=os.listdir(file_path)
  24. wj_list=[]
  25. num=0
  26. for wj in wj_names:
  27. new_wj=wj[:-11]
  28. if new_wj not in wj_list:
  29. wj_list.append(new_wj)
  30. else:
  31. os.remove(file_path+"\\"+wj)
  32. num+=1
  33. return num
  34. #更新数据源
  35. def refresh_data(file_path,sheet_name,data):
  36. book=openpyxl.load_workbook(file_path)
  37. writer=pd.ExcelWriter(file_path,engine="openpyxl")
  38. #在ExcelWriter的源代码中,它初始化空工作簿并删除所有工作表,
  39. #writer.book = book将原来表里面的内容保存到writer中
  40. writer.book=book
  41. #activate激活指定sheet工作表
  42. ws=book[sheet_name]
  43. #清空当前活动表数据
  44. for row in ws.iter_rows():
  45. for cell in row:
  46. cell.value=None
  47. #dataframe行列数
  48. idx_num,col_num=data.shape
  49. #新数据写入当前活动表-注意索引偏移
  50. for i in range(1,idx_num+1):
  51. for j in range(1,col_num+1):
  52. ws.cell(row=i,column=j).value=data.iloc[i-1,j-1]
  53. #保存关闭writer
  54. writer.save()
  55. writer.close()
  56. return None
  57. #文件检查
  58. def check_file(file_path,check_file="文件检查.xlsx"):
  59. wj_names=os.listdir(file_path)
  60. data=pd.DataFrame([wj.split("_")[2:] for wj in wj_names],columns=["店铺名称","日期"])
  61. data['日期']=data['日期'].str[:10]
  62. #标题columns放到dataframe中
  63. nind=data.index.insert(0,'0')
  64. data1=data.reindex(index=nind)
  65. data1.loc['0']=data.columns
  66. data1.reset_index(drop=True,inplace=True)
  67. #刷新数据源
  68. refresh_data(check_file,"数据源",data1)
  69. return None
  70. file_path="data"
  71. #日期格式:xxxx-xx eg:2020-07-01
  72. start_date=input("请输入开始日期:")
  73. end_date=input("请输入开始日期:")
  74. #生成日期区间-字符串类型
  75. date_xl_str=[str(i)[:10] for i in pd.date_range(start_date,end_date,freq='D')]
  76. #创建指定文件夹
  77. new_path=start_date+"~"+end_date
  78. try:
  79. os.mkdir(new_path)
  80. except:
  81. print("文件夹 【%s】 已存在"%new_path)
  82. #移动符合条件文件,并删除二级文件夹和多余文件
  83. move_file(file_path,new_path,date_xl_str)
  84. #文件去重
  85. num=qch_date(new_path)
  86. print("去除重复文件 %s 个"%num)
  87. #文件检查
  88. check_file(new_path)