好用的副檔名分類小程式|Python

閱讀時間約 7 分鐘
包容一切的海洋

包容一切的海洋


自從拿到相機後一直有個困擾,每次出門拍了很多照片,回來後除了初步挑選照片,將拍壞的照片刪除之外,再來就是將照片依照自己想要的方式歸檔。

平時拍照我都是拍攝RAW+JPG兩種格式的檔案,而相機拍攝完成存入記憶卡都是將這兩種格式放在同一個資料夾,回來後初步挑選完照片還要先分類出RAW檔與JPG檔,接著按照個人習慣年、月、日來分類照片......,每次回來的分類就要做一大堆步驟,有一天突然想著要是電腦可以自動幫我完成就好了,於是這隻小程式就誕生了。

我說的分類格式大概就像是下面這種檔案結構:

D:\Photo>tree /F
D:.
├─2022
└─2023
├─07
│ └─23
│ ├─jpg
│ │ 123.JPG
│ │
│ └─raf
222.raf
└─09
├─16
│ ├─jpg
│ │ 1.JPG
│ │ 2.JPG
│ │
│ └─raf
1.RAF
2.RAF

└─24
├─jpg
20230924.JPG

└─raf
20230924.RAF

這樣以後要找照片就會很方便,整整齊齊看的也開心,但是如果是手動的話,要新增好多個資料夾,最後還得自己移動照片到對應資料夾,實在太花時間了。所以才想說做個簡單的小程式來幫我處理這些動作,接著就稍微講解一下。

首先,導入我們需要的模組:

import os 
import shutil
from pathlib import Path
from datetime import datetime
from tkinter import filedialog

都是一些Python本來就內建的模組,不需要額外安裝。os用來抓取檔案最後修改時間的timestamp,就是依據這個來建立年月日階層資料夾;shutil進行檔案的移動;pathlib來操作路徑;利用datetimefromtimestamp函數來將os所抓取到的最後修改時間的timestamp轉換成日期物件;最後導入tkinterfiledialog函數來讓我們可以選擇指定的資料夾。

導入完模組後,接著讓我們寫一個移動檔案的函數:

# 將文件按照修改日期分類並移動到目標資料夾的函數
def categorize_files(file_list, dest_folder, file_extension):
    count = 0
    for file in file_list:
        modification_time = datetime.fromtimestamp(os.path.getmtime(file))
        year = modification_time.year
        month = modification_time.month
        day = modification_time.day

        # 創建目標資料夾的路徑,按照年月日層級
        file_path = dest_folder / str(year) / str(month).zfill(2) / str(day).zfill(2) / file_extension

        if not file_path.exists():
            file_path.mkdir(parents=True)

        # 移動文件到目標路徑
        shutil.move(file, file_path / file.name)
        count += 1

    return count

接下來這段就是我們的主要函數啦,

def main(source_dir, target_dir, extensions):
    dir1, dir2 = source_dir, target_dir

    if not dir1 or not dir2 or not extensions:
        print("請指定來源資料夾、目標資料夾和至少一個副檔名。")
        return

    # 遍歷選定的副檔名列表
    for ext in extensions:
        file_extension = ext.lower()
        path1, path2 = Path(dir1), Path(dir2)

        # 獲取來源資料夾中符合副檔名的文件列表
        file_list = list(path1.glob(f'*.{file_extension}'))

        if not file_list:
            print(f"未找到{file_extension}格式的文件,請重新輸入正確的選擇。")
            continue

        # 調用categorize_files函數,將文件按照修改日期分類並移動到目標資料夾
        count = categorize_files(file_list, path2, file_extension)
        print(f"完成!!一共有 {count}{file_extension}格式的文件被移動")

if __name__ == "__main__":
    source_dir = filedialog.askdirectory(title="選擇來源資料夾")
    target_dir = filedialog.askdirectory(title="選擇目標資料夾")
    extensions = input("請輸入要移動的副檔名,用空格分隔:").split()
    main(source_dir, target_dir, extensions)

執行的時候就會跳出要請我們選擇資料夾的畫面,只要選擇需要分類的資料夾,與想移動到的資料夾以及輸入想移動的附檔名,程式就會自動按照檔案的最後修改日期來進行年月日階層的建立資料夾與移動檔案,並在最後告訴你總共有幾個檔案被移動,是不是很方便!

後續我也利用了tkinter建出一個簡單的GUI介面方便使用,相比上面那段程式,也不用自己打副檔名了,滑鼠點點就可以操作,也能夠新增或移除預設的副檔名!雖然樣貌有點陽春,但功能還是有的!

不知道為甚麼字糊糊的感覺...

不知道為甚麼字糊糊的感覺...

改天再來分享一下如何製作GUI出來。

avatar-img
10會員
26內容數
隨筆是我內心的聲音,隨影是我眼中的記憶。或許,在這個不斷流轉的人生中,它們是我最真實的見證和表達方式。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
隨筆,隨影 的其他內容
最近剛好在試著研究Python的虛擬環境,今天就來稍稍筆記一下。 在之前我其實也一直搞不懂這個,直到前陣子好好靜下心研究研究後有些心得。 在 Python 開發中,經常需要建立虛擬環境,來隔離不同專案所需的套件及依賴關係。這樣可以確保每個專案使用的套件版本都是一致的,避免可能的衝突和混淆。
自然圈農場,從幾年前露營興盛起來的時候就一直有聽過這個名字,我一直聽到人們超級推薦這個地方,每個人分享的照片也都很好看,看得我心癢癢的很想親自看看,無奈實在是太難訂了,後來也忘了這回事。
毫無計畫的一天,想說找個地方待著可以順道騎車吹吹風,這時候就慶幸平常有在收集口袋名單。翻了翻名單後,我鎖定了一間咖啡廳。
一個月前的某一天,平凡的日常中,在電視上看到一個露營節目,我隨口對著身旁一起看電視的老姊說了句:「要不要去試試看露營?」「喔好啊。」她竟然意外的答應了,不過心想她應該不會當真。
嘿!這週想分享一下我第一次的獨自旅行經驗。 老實說,在出發之前,我對於面對孤獨感和未知的旅程感到有些緊張,雖然平時我常常獨自一人到處走走,心裡想著不就是獨自出遊嗎?但這次的過夜旅程對我來說還是一個全新的挑戰。我之前總是告訴自己,只是一個人的旅行嘛,應該沒什麼大不了的。
最近剛好在試著研究Python的虛擬環境,今天就來稍稍筆記一下。 在之前我其實也一直搞不懂這個,直到前陣子好好靜下心研究研究後有些心得。 在 Python 開發中,經常需要建立虛擬環境,來隔離不同專案所需的套件及依賴關係。這樣可以確保每個專案使用的套件版本都是一致的,避免可能的衝突和混淆。
自然圈農場,從幾年前露營興盛起來的時候就一直有聽過這個名字,我一直聽到人們超級推薦這個地方,每個人分享的照片也都很好看,看得我心癢癢的很想親自看看,無奈實在是太難訂了,後來也忘了這回事。
毫無計畫的一天,想說找個地方待著可以順道騎車吹吹風,這時候就慶幸平常有在收集口袋名單。翻了翻名單後,我鎖定了一間咖啡廳。
一個月前的某一天,平凡的日常中,在電視上看到一個露營節目,我隨口對著身旁一起看電視的老姊說了句:「要不要去試試看露營?」「喔好啊。」她竟然意外的答應了,不過心想她應該不會當真。
嘿!這週想分享一下我第一次的獨自旅行經驗。 老實說,在出發之前,我對於面對孤獨感和未知的旅程感到有些緊張,雖然平時我常常獨自一人到處走走,心裡想著不就是獨自出遊嗎?但這次的過夜旅程對我來說還是一個全新的挑戰。我之前總是告訴自己,只是一個人的旅行嘛,應該沒什麼大不了的。
你可能也想看
Google News 追蹤
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
本篇內容介紹如何使用 Python中的 moviepy library 簡單的剪影片。 先安裝moviepy library , 用pip install moviepy , 可參考官方文件。 要剪的影片和python檔要在同個資料夾中,若不在同個位置要用 os library 更換路徑
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
攝影作品的排序方法對於展示、出版造成重要影響,本篇分享了五種排序分類,包括故事發展排序、圖像學排序、詩一樣排序、拍攝時間排序和檔案排序。這些排序方式針對不同的作品和用途,提供了不同的展示方式和意義。
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
沒想到新的一年開始想要整理硬碟裡的資料的時候,我的D槽就被我各種瞎搞變成RAW了(哭),導致這幾天都在拯救我的電腦無心想別的,到今天才想起我的豐盛冥想(哭)。剩兩天了~~就把它一次貼完~把我的豐盛冥想之旅分享完。 希望你們也能完成自己的豐盛冥想,不管是否落後,用自己的步伐一步步做完即可。 今
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
本篇內容介紹如何使用 Python中的 moviepy library 簡單的剪影片。 先安裝moviepy library , 用pip install moviepy , 可參考官方文件。 要剪的影片和python檔要在同個資料夾中,若不在同個位置要用 os library 更換路徑
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
攝影作品的排序方法對於展示、出版造成重要影響,本篇分享了五種排序分類,包括故事發展排序、圖像學排序、詩一樣排序、拍攝時間排序和檔案排序。這些排序方式針對不同的作品和用途,提供了不同的展示方式和意義。
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
沒想到新的一年開始想要整理硬碟裡的資料的時候,我的D槽就被我各種瞎搞變成RAW了(哭),導致這幾天都在拯救我的電腦無心想別的,到今天才想起我的豐盛冥想(哭)。剩兩天了~~就把它一次貼完~把我的豐盛冥想之旅分享完。 希望你們也能完成自己的豐盛冥想,不管是否落後,用自己的步伐一步步做完即可。 今