如何用python寫一個檔案管理程式
阿新 • • 發佈:2021-01-12
不知道大家有沒有想過用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 walk
path="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 os
path="data"
for curDir, dirs, files in os.walk(path):
for file in files:
print(os.path.join(curDir, file))
data\2020-07-12 - 第一層.xlsx
data\2020-07-13 - 第一層.xlsx
data\2020-07-14 - 第一層.xlsx
data\testA\2020-07-12-A.xlsx
data\testA\2020-07-13-A.xlsx
data\testA\2020-07-14-A.xlsx
data\testB\2020-07-12-B.xlsx
data\testB\2020-07-13-B.xlsx
data\testB\2020-07-14-B.xlsx
data\testC\2020-07-12-C.xlsx
data\testC\2020-07-13-C.xlsx
data\testC\2020-07-14-C.xlsx
輸出指定型別檔案
#endswith 擷取檔案字尾
import os
path="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 os
path="data"
for curDir, dirs, files in os.walk(path):
for _dir in dirs:
print(os.path.join(curDir, _dir))
data\testA
data\testB
data\testC
「案例程式碼」
綜合運用os.walk()——檔案指定日期整理程式
import pandas as pd
import numpy as np
import 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-01
start_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_date
try:
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)