本文介紹基於Python語言,讀取一個資料夾,並將其中每一個子資料夾內符合名稱要求的檔加以篩選,並將篩選得到的檔復制到另一個目標文件夾中的方法。
本文的需求是:現在有一個大的資料夾,其中含有多個子資料夾,如下圖所示。
對於其中的每一個子資料夾,都含有大量的檔;例如,我們就開啟上圖中的
2021
資料夾,得到結果如下圖所示。
我們的需求是,希望基於每一個子資料夾內的每一個檔,將檔名稱中含有指定欄位的檔提取出來——在本文中,我們就希望提取得到檔名稱中含有
STB
欄位的,也就是上圖紫色框內出現
STB
的檔是我們需要的。提取到全部符合要求的檔後,我們還需要將這些檔都復制到另一個目標文件夾中。
明確了需求,接下來就可以開始程式碼的撰寫。本文所用到的程式碼如下所示。
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Created on Mon Oct 2 12:48:49 2023
5
6@author: fkxxgis
7"""
8
9import os
10import shutil
11
12source_folder = "/media/dell/p0-35/GF_SR"
13target_folder = "/media/dell/p0-35/GF_SR/STB"
14
15if not os.path.exists(target_folder):
16 os.makedirs(target_folder)
17
18year_folders = [f for f in os.listdir(source_folder) if os.path.isdir(os.path.join(source_folder, f))]
19
20for year_folder in year_folders:
21 if year_folder == "STB":
22 continue
23 year_folder_path = os.path.join(source_folder, year_folder)
24 for file_name in os.listdir(year_folder_path):
25 if "STB" in file_name:
26 source_file = os.path.join(year_folder_path, file_name)
27 target_file = os.path.join(target_folder, file_name)
28 shutil.copy(source_file, target_file)
其中,我們匯入了
os
和
shutil
模組,它們都提供了處理檔和目錄的功能;同時,我們定義了源資料夾路徑
source_folder
(也就是儲存有多個子資料夾的資料夾路徑)和目標文件夾路徑
target_folder
(也就是最終結果存放的路徑)。
隨後,我們使用
os.makedirs()
函數檢查目標文件夾是否存在,如果不存在則建立它。接下來,我們使用列表推導式生成一個包含源資料夾中所有子資料夾的列表
year_folders
;其中,我們使用了
os.listdir()
函數獲取源資料夾中的所有檔和資料夾,並使用
os.path.isdir()
函數判斷是否為資料夾。
接下來,我們就開始遍歷每個子資料夾。首先,需要註意的是,我們要檢查當前遍歷的子資料夾是否為我們的目標文件夾路徑
STB
;如果是,則跳過該子資料夾的處理——這一步驟是防止我們用來存放結果的目標文件夾也被遍歷,否則就會出現檔復制沖突。
其次,構建當前遍歷的子資料夾的完整路徑
year_folder_path
,並使用
os.listdir()
函數獲取子資料夾中的所有檔。隨後,再遍歷剛剛得到的子資料夾中的每個檔——如果檔名包含
STB
,那麽這個檔就是我們需要的檔;我們就構建原始檔(待復制的檔)的完整路徑
source_file
和目標文件(預計復制完畢的檔)的完整路徑
target_file
,並緊接著使用
shutil.copy()
函數將原始檔復制到目標文件。
透過這樣的遍歷,我們就能夠將源資料夾路徑
source_folder
中全部含有
STB
欄位的檔復制到我們的目標文件夾中了。
執行上述程式碼,即可在我們的目標文件夾中看到全部含有
STB
欄位的檔,如下圖所示。
至此,大功告成。