按照文本每行匹配文件复制到指定位置
🧩 功能简介
从指定的 TXT 文件(txt_file)中读取若干关键字(去重并按字典序排序)。
在给定的源目录(source_dir)及其子目录中,查找文件名包含该关键字的第一个文件。
程序会将匹配文件移动到目标目录(target_dir),并在遇到重名文件时自动添加后缀 _1, _2… 以避免覆盖。
执行过程中会在控制台输出每个关键字的匹配与移动结果,并最终汇总统计信息。
📂 示例目录结构
H:\
├─ data
│ ├─ report1.txt
│ ├─ image_fail.png
│ └─ sub
│ └─ test_error.log
├─ list.txt
└─ copy (初始为空)
list.txt 内容如下:
report
fail
missing
error
💻 运行效果
控制台输出
✔ 已移动: 'report1.txt' 对应关键字 'report' 到 'H:\copy\report1.txt'
✔ 已移动: 'image_fail.png' 对应关键字 'fail' 到 'H:\copy\image_fail.png'
⚠ 未找到匹配文件 for key: 'missing'
✔ 已移动: 'test_error.log' 对应关键字 'error' 到 'H:\copy\test_error.log'
共 4 个关键字,成功移动 3 个,对应文件。未移动 1 个。
执行后目录结构
H:\
├─ data
│ └─ sub
│ └─ (原 test_error.log 已移动)
├─ copy
│ ├─ report1.txt
│ ├─ image_fail.png
│ └─ test_error.log
├─ list.txt
🧠 实现代码
import os
import shutil
def move_files_from_txt(txt_file, source_dir, target_dir):
"""
根据 TXT 文件中的关键字匹配并移动文件。
仅移动文件名中包含任意关键字的第一个文件。
"""
# 创建目标目录
os.makedirs(target_dir, exist_ok=True)
# 读取关键字并去重、排序
with open(txt_file, 'r', encoding='utf-8') as f:
keys = sorted({line.strip() for line in f if line.strip()})
moved_keys = set()
# 遍历关键字匹配文件
for key in keys:
found = False
for root, _, files in os.walk(source_dir):
for fname in files:
if key in fname:
src = os.path.join(root, fname)
dst = os.path.join(target_dir, fname)
# 若重名则自动加后缀
if os.path.exists(dst):
base, ext = os.path.splitext(fname)
i = 1
while os.path.exists(os.path.join(target_dir, f"{base}_{i}{ext}")):
i += 1
dst = os.path.join(target_dir, f"{base}_{i}{ext}")
# 执行移动
shutil.move(src, dst)
print(f"✔ 已移动: '{fname}' 对应关键字 '{key}' 到 '{dst}'")
moved_keys.add(key)
found = True
break
if found:
break
if not found:
print(f"⚠ 未找到匹配文件 for key: '{key}'")
# 汇总统计
total = len(keys)
success = len(moved_keys)
print(f"\n共 {total} 个关键字,成功移动 {success} 个,对应文件。未移动 {total - success} 个。")
if __name__ == '__main__':
txt_file = r"H:\list.txt"
source_directory = r"H:\data"
target_directory = r"H:\copy"
move_files_from_txt(txt_file, source_directory, target_directory)🧾 输出统计说明
| 项目 | 含义 |
|---|---|
| ✔ 已移动 | 匹配成功并完成移动 |
| ⚠ 未找到 | 该关键字未匹配到任何文件 |
| 汇总统计 | 总关键字数、成功数、失败数 |
🔒 注意事项
- 仅匹配文件名包含关键字的第一个文件。
- 若希望 不区分大小写,可将判断修改为:
if key.lower() in fname.lower():
- 若希望复制而非移动,可将:
改为:
shutil.move(src, dst)
shutil.copy2(src, dst)
🧭 总结
该脚本非常适合以下场景:
- 按关键字批量提取文件(如日志、报告、截图)。
- 自动归档、整理、迁移工作目录中的散乱文件。
- 按任务或主题关键词筛选文件。
❤️ 转载文章请注明出处,谢谢!❤️