自動(dòng)化文件管理的六個(gè) Python 腳本模板
文件管理是我們?nèi)粘9ぷ髦谐R姷娜蝿?wù)之一,Python作為一種功能強(qiáng)大的編程語言,可以幫助我們輕松完成這些任務(wù)。今天我們來學(xué)習(xí)6個(gè)實(shí)用的Python腳本模板,讓自動(dòng)化文件管理工作變得簡單又高效。
1. 獲取指定目錄下的所有文件
首先,我們學(xué)習(xí)如何獲取指定目錄下的所有文件。這通常是文件管理的第一步。
import os
def list_files_in_directory(directory):
# 使用os.listdir列出指定目錄中的所有文件和子目錄
files_and_directories = os.listdir(directory)
# 篩選出文件(不是子目錄)
only_files = [file for file in files_anddirectories if os.path.isfile(os.path.join(directory, file))]
return only_files
# 示例使用
my_directory = 'C:/Users/username/Documents'
files = list_files_in_directory(my_directory)
print("以下是文件列表:")
for f in files:
print(f)
# 輸出:將顯示指定目錄的所有文件名稱。
這個(gè)函數(shù)利用了os模塊來處理與文件相關(guān)的操作。
2. 文件按擴(kuò)展名分類
當(dāng)我們需要對(duì)大量文件進(jìn)行整理時(shí),按擴(kuò)展名分類是一個(gè)非常好的方法。
def sort_files_by_extension(directory):
from collections import defaultdict
files_dict = defaultdict(list) # 創(chuàng)建默認(rèn)字典用于存儲(chǔ)不同擴(kuò)展名的文件
for file_name in os.listdir(directory):
if os.path.isfile(os.path.join(directory, file_name)): # 檢查是否是文件
_, ext = os.path.splitext(file_name) # 分割文件名和擴(kuò)展名
if ext: # 如果有擴(kuò)展名,則加入到相應(yīng)的鍵中
files_dict[ext].append(file_name)
return dict(files_dict)
# 示例使用
my_directory = "C:/temp"
files_sorted = sort_files_by_extension(my_directory)
# 打印分類后的結(jié)果
for extension, files_list in files_sorted.items():
print(f"文件類型 {extension}:")
for fname in files_list:
print(fname)
這里用到了collections.defaultdict以便于快速生成一個(gè)按照文件擴(kuò)展名歸類的字典。
3. 移動(dòng)文件到特定的文件夾
當(dāng)你已經(jīng)按照某種規(guī)則分類了文件,下一步就是把它們移動(dòng)到相應(yīng)的位置上。
import shutil
def move_files_based_on_extension(source_dir, destination_base_dir):
sorted_files = sort_files_by_extension(source_dir)
for ext, filenames in sorted_files.items():
destination_folder = os.path.join(destination_base_dir, ext[1:]) # 忽略點(diǎn)號(hào)
if not os.path.exists(destination_folder): # 如果不存在則創(chuàng)建
os.makedirs(destination_folder)
for filename in filenames:
full_path = os.path.join(source_dir, filename)
new_path = os.path.join(destination_folder, filename)
shutil.move(full_path, new_path) # 移動(dòng)文件
print(f"已將文件{filename}移動(dòng)到{new_path}")
# 示例使用
move_files_based_on_extension('C:/Source', 'C:/Destination')
我們用到shutil.move()函數(shù)來執(zhí)行文件移動(dòng),并且保證了不會(huì)丟失原文件位置信息。
4. 計(jì)算單個(gè)或多個(gè)文件的總大小
知道所管理和移動(dòng)的文件總體量,對(duì)于優(yōu)化磁盤空間非常有用。
def get_total_size_of_files(directory, filenames=None):
total_size = 0
if filenames is None: # 如果沒有指定文件列表,則讀取全部文件
filenames = os.listdir(directory)
for filename in filenames:
filepath = os.path.join(directory, filename)
if os.path.isfile(filepath): # 只考慮實(shí)際存在的文件
total_size += os.path.getsize(filepath)
return total_size
# 示例
size = get_total_size_of_files('C:/SourceFiles')
print(f"該目錄下文件總大小為: {size/(1024**2)} MB") # 轉(zhuǎn)換為MB
這里的代碼展示了如何通過遍歷和os.path.getsize()函數(shù)得到所有文件的總大小。
5. 刪除超過一定天數(shù)的舊文件
有時(shí)需要清理長期未被訪問的舊文件。
from datetime import datetime, timedelta
def remove_old_files(path_to_scan, days_limit=30):
critical_time = datetime.now() - timedelta(days=days_limit)
for root, dirs, files in os.walk(path_to_scan):
for file in files:
file_full_path = os.path.join(root, file)
mod_time = datetime.fromtimestamp(os.path.getmtime(file_full_path))
if mod_time < critical_time: # 超過限制日期,刪除
print(f"刪除文件:{file_full_path}")
os.remove(file_full_path)
# 使用示例
remove_old_files('C:/OldData', 365) # 刪除一年以上的文件
通過比較文件修改時(shí)間與設(shè)定的天數(shù)限制值,可以確定哪些文件應(yīng)該被刪除。
6. 壓縮文件或整個(gè)目錄為zip格式
最終的一個(gè)腳本例子是如何將某些重要文件壓縮成.zip形式保存。
import zipfile
def compress_directory(dir_to_zip, output_filename='archive'):
# 創(chuàng)建壓縮包實(shí)例
zipf = zipfile.ZipFile(output_filename + '.zip', 'w', zipfile.ZIP_DEFLATED)
# 遍歷并添加所有文件到zip包內(nèi)
for root, dirs, files in os.walk(dir_to_zip):
for file in files:
zipf.write(os.path.join(root, file),
os.path.relpath(os.path.join(root, file),
os.path.join(dir_to_zip, '..')))
zipf.close()
# 使用
compress_directory('C:/BackupThis', 'backup_archive')
上述代碼將指定目錄下的所有內(nèi)容都添加到名為“archive.zip”的壓縮文件里。
實(shí)戰(zhàn)案例:整理家庭相冊(cè)
設(shè)想一下你需要整理一個(gè)包含數(shù)千張照片的大相冊(cè):
- 步驟一: 獲取目標(biāo)目錄里的全部圖片。
- 步驟二: 根據(jù)年份(通過圖片元數(shù)據(jù)提取或者以文件創(chuàng)建時(shí)間為標(biāo)準(zhǔn))分組。
- 步驟三: 新建相應(yīng)的文件夾,并按組移入相應(yīng)的位置。
- 步驟四: 壓縮每一年的照片為單獨(dú)的存檔壓縮文件備份至另一存儲(chǔ)裝置上。 通過組合以上模板可以有效實(shí)現(xiàn)上述流程。
本文介紹了從基本列出文件到高級(jí)文件處理操作如分類、移動(dòng)、大小計(jì)算、刪除、以及壓縮等多個(gè)Python腳本模版;并且給出了實(shí)際應(yīng)用場景下綜合運(yùn)用多個(gè)腳本的情況解析。