當前位置: 華文天下 > 辟謠

Python將具有指定名稱欄位的檔加以批次復制的方法

2024-04-24辟謠

本文介紹基於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 欄位的檔,如下圖所示。

至此,大功告成。

想了解更多精彩內容,快來關註瘋狂學習GIS