Python結合檔名稱將多個檔案複製到不同路徑下

疯狂学习GIS發表於2024-06-05

  本文介紹基於Python語言,針對一個資料夾下的大量柵格遙感影像檔案,基於其各自的檔名,分別建立指定名稱的新資料夾,並將對應的柵格遙感影像檔案複製到不同的新資料夾下的方法。

  首先,我們來看一下本文需要實現的需求。現有一個資料夾,其中有大量.tif格式的柵格遙感影像檔案,以及.xmlovr等格式的遙感影像輔助資訊檔案,如下圖所示。

image

  其中,如上圖中紫色框所示,每一景遙感影像檔案的檔名稱中,都有一個表示其編號的欄位;我們希望基於這一編號欄位,將帶有相同編號欄位的柵格遙感影像檔案,以及其對應的輔助資訊檔案,都複製到一個結果資料夾中;這個結果資料夾如下圖所示。

  其中,結果資料夾內含有多個不同編號子資料夾,這個編號就是上上圖中,柵格遙感影像所帶有的編號。例如,我們希望將所有檔名稱中帶有15欄位的柵格遙感影像檔案及其輔助資訊檔案,都複製到結果資料夾中名稱為15子資料夾中,以此類推。

  知道了具體需求,我們即可開始程式碼的撰寫。本文所用到的程式碼如下所示。

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 13 20:25:04 2023

@author: fkxxgis
"""

import os
import re
import shutil

tif_file_path = r"E:\02_Project\01_Chlorophyll\Fishnet\Result"
result_file_path = r"E:\02_Project\01_Chlorophyll\Fishnet\ResultFolder"

file_list = os.listdir(tif_file_path)
for file in file_list:
    file_id_suffix = file.split("_")[2]
    file_id = re.findall("\d+", file_id_suffix)[0]
    if not os.path.exists(os.path.join(result_file_path, file_id)):
        os.makedirs(os.path.join(result_file_path, file_id))
        print("Make " + file_id + " path.")
    shutil.copy(os.path.join(tif_file_path, file), os.path.join(result_file_path, file_id, file))

  其中,tif_file_path是儲存有原有待複製遙感影像檔案的資料夾,result_file_path則表示最終的結果資料夾。

  程式碼的整體思路也非常簡單。首先,我們需要匯入osreshutil3Python庫,分別實現系統檔案遍歷、字串匹配與遙感影像檔案的複製。其次,我們透過os.listdir()函式,遍歷待複製遙感影像檔案對應的資料夾,獲取其中的每一個檔案;這裡的檔案既包括.tif格式的柵格遙感影像檔案,同時也包括.xmlovr等格式的遙感影像輔助資訊檔案

  隨後,對每一個檔案加以處理。我們基於每一個檔案的檔名稱的規則,透過split()函式,將其中表示編號的欄位以及這一欄位之後的內容提取出來;緊接著,基於re.findall()函式,透過字串匹配的方式,將表示編號的欄位(也就是檔名稱中的數字部分)提取出來。

  接下來,知道了當前檔案對應的編號,我們就可以開始複製工作。但是這裡需要注意,由於我們需要將每一個檔案都放入結果資料夾中的子資料夾,因此需要首先判斷當前子資料夾有沒有被建立;如果沒有建立的話,我們需要建立一下這個子資料夾。這一步驟透過if判斷語句及其內部的程式碼即可實現——透過os.path.exists()函式判斷是否存在指定的子資料夾,如果不存在的話就新建這一子資料夾。

  隨後,就可以開始檔案的複製工作了。這一步驟我們透過shutil.copy()函式即可實現。

  執行上述程式碼後,我們即可在結果資料夾中看到各個編號對應的子資料夾,並在子資料夾中看到這一編號對應的全部檔案。如下圖所示,可以看到結果資料夾中,名稱為15子資料夾內,包含的就是檔名稱中帶有15欄位的所有遙感影像檔案及其對應的輔助資訊檔案

  至此,大功告成。

相關文章