Python實(shí)現(xiàn)單個(gè)或批量文件移動(dòng)的示例代碼
在日常辦公和數(shù)據(jù)處理中,我們經(jīng)常需要將文件從一個(gè)目錄移動(dòng)到另一個(gè)指定目錄,手動(dòng)操作不僅繁瑣,還容易出錯(cuò)(尤其是批量移動(dòng)場(chǎng)景)。Python 提供了多種簡(jiǎn)潔高效的實(shí)現(xiàn)方案,本文將詳細(xì)介紹文件移動(dòng)的核心方法,并結(jié)合實(shí)際案例實(shí)現(xiàn)批量文件移動(dòng)。
一、核心模塊介紹
Python 實(shí)現(xiàn)文件移動(dòng)主要依賴兩個(gè)核心模塊,各自有不同的適用場(chǎng)景:
shutil模塊:Python 標(biāo)準(zhǔn)庫中的高級(jí)文件操作模塊,提供了直接的文件/目錄移動(dòng)接口,兼容性好、使用簡(jiǎn)單,是文件移動(dòng)的首選方案。os模塊:Python 基礎(chǔ)文件操作模塊,主要用于輔助獲取文件路徑、遍歷目錄等,通常與shutil配合使用(批量移動(dòng)場(chǎng)景必備)。
二、單個(gè)文件移動(dòng)實(shí)現(xiàn)
使用 shutil.move(src, dst) 是實(shí)現(xiàn)單個(gè)文件移動(dòng)的核心函數(shù),參數(shù)說明:
src:源文件路徑(完整路徑/相對(duì)路徑均可,必須是具體文件,不能是目錄)dst:目標(biāo)路徑,有兩種情況:- 目標(biāo)路徑是目錄(已存在):文件將被移動(dòng)到該目錄下,保持原文件名不變
- 目標(biāo)路徑是具體文件名稱:文件移動(dòng)后將被重命名為該名稱
代碼示例
import shutil
def move_single_file(src_file, dst_path):
"""
單個(gè)文件移動(dòng)
:param src_file: 源文件完整路徑/相對(duì)路徑
:param dst_path: 目標(biāo)目錄/目標(biāo)文件完整路徑
"""
try:
# 執(zhí)行文件移動(dòng)
shutil.move(src_file, dst_path)
print(f"文件移動(dòng)成功:{src_file} -> {dst_path}")
except FileNotFoundError:
print(f"錯(cuò)誤:源文件 {src_file} 不存在,或目標(biāo)目錄不存在")
except PermissionError:
print(f"錯(cuò)誤:沒有權(quán)限移動(dòng)文件 {src_file}")
except Exception as e:
print(f"未知錯(cuò)誤:{e}")
# 調(diào)用示例1:目標(biāo)路徑為目錄(文件保持原名)
if __name__ == "__main__":
source_file = "test.txt" # 源文件(當(dāng)前目錄下的test.txt)
target_dir = "./target_folder" # 目標(biāo)目錄(當(dāng)前目錄下的target_folder,需提前創(chuàng)建)
move_single_file(source_file, target_dir)
# 調(diào)用示例2:目標(biāo)路徑為文件(文件移動(dòng)后重命名)
# source_file = "data.csv"
# target_file = "./target_folder/new_data.csv"
# move_single_file(source_file, target_file)
補(bǔ)充說明
- 使用前需確保目標(biāo)目錄已存在(若不存在,可通過
os.makedirs(dst_dir, exist_ok=True)自動(dòng)創(chuàng)建) - 該方法支持跨磁盤分區(qū)移動(dòng)文件(Windows 系統(tǒng)下也可正常使用)
三、批量文件移動(dòng)案例
批量文件移動(dòng)的核心思路是:遍歷源目錄中的目標(biāo)文件 → 逐個(gè)執(zhí)行移動(dòng)操作,以下提供 3 個(gè)實(shí)用案例,覆蓋不同場(chǎng)景需求。
案例1:批量移動(dòng)指定目錄下的所有文件(不限類型)
需求:將 source_folder 下的所有文件(不包含子目錄中的文件)批量移動(dòng)到 target_folder 中。
import shutil
import os
def batch_move_all_files(src_dir, dst_dir):
"""
批量移動(dòng)指定目錄下的所有文件(不含子目錄文件)
:param src_dir: 源目錄路徑
:param dst_dir: 目標(biāo)目錄路徑
"""
# 1. 檢查并創(chuàng)建目標(biāo)目錄(若不存在)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"目標(biāo)目錄不存在,已自動(dòng)創(chuàng)建:{dst_dir}")
# 2. 遍歷源目錄中的所有文件
for file_name in os.listdir(src_dir):
# 拼接源文件完整路徑
src_file_path = os.path.join(src_dir, file_name)
# 判斷是否為文件(排除子目錄)
if os.path.isfile(src_file_path):
# 3. 執(zhí)行移動(dòng)(目標(biāo)路徑為目錄,保持原文件名)
shutil.move(src_file_path, dst_dir)
print(f"已移動(dòng):{file_name}")
print("所有文件批量移動(dòng)完成!")
# 調(diào)用示例
if __name__ == "__main__":
source_directory = "./source_files" # 源目錄
target_directory = "./target_files" # 目標(biāo)目錄
batch_move_all_files(source_directory, target_directory)
案例2:批量移動(dòng)指定類型的文件(按后綴名篩選)
需求:僅移動(dòng) source_folder 下的 .txt 和 .pdf 文件,其他類型文件不處理。
import shutil
import os
def batch_move_specified_type(src_dir, dst_dir, file_extensions):
"""
批量移動(dòng)指定后綴名的文件
:param src_dir: 源目錄路徑
:param dst_dir: 目標(biāo)目錄路徑
:param file_extensions: 要移動(dòng)的文件后綴名列表(如 ['.txt', '.pdf'])
"""
# 檢查并創(chuàng)建目標(biāo)目錄
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"自動(dòng)創(chuàng)建目標(biāo)目錄:{dst_dir}")
# 遍歷源目錄
for file_name in os.listdir(src_dir):
# 篩選指定后綴名的文件(忽略大小寫)
if any(file_name.lower().endswith(ext.lower()) for ext in file_extensions):
src_file_path = os.path.join(src_dir, file_name)
if os.path.isfile(src_file_path):
# 移動(dòng)文件
shutil.move(src_file_path, dst_dir)
print(f"已移動(dòng)指定類型文件:{file_name}")
print(f"指定類型({file_extensions})文件批量移動(dòng)完成!")
# 調(diào)用示例
if __name__ == "__main__":
src_dir = "./source_files"
dst_dir = "./txt_pdf_target"
target_extensions = [".txt", ".pdf"] # 要移動(dòng)的文件類型
batch_move_specified_type(src_dir, dst_dir, target_extensions)
案例3:遞歸批量移動(dòng)(包含子目錄中的目標(biāo)文件)
需求:移動(dòng) source_folder 及其所有子目錄下的 .jpg 圖片文件,保持文件的相對(duì)目錄結(jié)構(gòu)(可選)。
import shutil
import os
def batch_move_recursive(src_dir, dst_dir, file_extension=".jpg"):
"""
遞歸遍歷子目錄,批量移動(dòng)指定類型文件
:param src_dir: 源根目錄路徑
:param dst_dir: 目標(biāo)根目錄路徑
:param file_extension: 要移動(dòng)的文件后綴名
"""
# 遍歷源目錄及其所有子目錄(遞歸遍歷)
for root, dirs, files in os.walk(src_dir):
for file_name in files:
# 篩選指定后綴名文件
if file_name.lower().endswith(file_extension.lower()):
# 源文件完整路徑
src_file_path = os.path.join(root, file_name)
# (可選)保持相對(duì)目錄結(jié)構(gòu):拼接目標(biāo)文件的相對(duì)路徑
relative_path = os.path.relpath(root, src_dir)
target_sub_dir = os.path.join(dst_dir, relative_path)
if not os.path.exists(target_sub_dir):
os.makedirs(target_sub_dir)
# 移動(dòng)文件到對(duì)應(yīng)子目錄
shutil.move(src_file_path, target_sub_dir)
print(f"已遞歸移動(dòng):{src_file_path} -> {target_sub_dir}")
print(f"遞歸批量移動(dòng) {file_extension} 文件完成!")
# 調(diào)用示例
if __name__ == "__main__":
source_root_dir = "./source_images"
target_root_dir = "./target_images"
batch_move_recursive(source_root_dir, target_root_dir, ".jpg")
四、常見問題與注意事項(xiàng)
- 目標(biāo)目錄不存在:使用
os.makedirs(dst_dir, exist_ok=True)可自動(dòng)創(chuàng)建目錄,exist_ok=True表示目錄已存在時(shí)不報(bào)錯(cuò)。 - 文件重名沖突:若目標(biāo)目錄中已存在同名文件,
shutil.move()會(huì)直接覆蓋原有文件(Windows 系統(tǒng)下會(huì)提示確認(rèn),Linux/Mac 系統(tǒng)下直接覆蓋)。如需避免覆蓋,可在移動(dòng)前判斷目標(biāo)文件是否存在:dst_file_path = os.path.join(dst_dir, file_name) if not os.path.exists(dst_file_path): shutil.move(src_file_path, dst_dir) else: print(f"目標(biāo)目錄已存在同名文件,跳過:{file_name}") - 路徑格式問題:推薦使用
os.path.join()拼接路徑,可自動(dòng)適配 Windows(\)和 Linux/Mac(/)的路徑分隔符,避免手動(dòng)拼接路徑導(dǎo)致的錯(cuò)誤。 - 權(quán)限問題:若程序提示
PermissionError,需檢查源文件/目標(biāo)目錄的讀寫權(quán)限(Windows 下可能是文件被占用,Linux/Mac 下可通過chmod命令修改權(quán)限)。
總結(jié)
- Python 文件移動(dòng)的核心是
shutil.move()函數(shù),搭配os模塊可實(shí)現(xiàn)靈活的路徑處理和目錄遍歷。 - 單個(gè)文件移動(dòng)直接使用
shutil.move(src, dst),需注意目標(biāo)路徑是目錄還是具體文件名。 - 批量文件移動(dòng)的關(guān)鍵是遍歷源目錄,可通過
os.listdir()(非遞歸)或os.walk()(遞歸)實(shí)現(xiàn)文件篩選。 - 實(shí)際使用中需處理目錄不存在、文件重名、權(quán)限不足等異常情況,提升程序的健壯性。
到此這篇關(guān)于Python實(shí)現(xiàn)單個(gè)或批量文件移動(dòng)的示例代碼的文章就介紹到這了,更多相關(guān)Python 單個(gè)或批量文件移動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 的 openpyxl模塊 讀取 Excel文件的方法
這篇文章主要介紹了python 的 openpyxl模塊 讀取 Excel文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
python重試裝飾器的簡(jiǎn)單實(shí)現(xiàn)方法
今天小編就為大家分享一篇python重試裝飾器的簡(jiǎn)單實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python易忽視知識(shí)點(diǎn)小結(jié)
這篇文章主要介紹了Python易忽視知識(shí)點(diǎn),實(shí)例分析了Python中容易被忽視的常見操作技巧,需要的朋友可以參考下2015-05-05
Django?celery的替代品Dramatiq使用特性詳解

