python小工具——文件复制

本文介绍了一个Python脚本,用于快速复制源文件夹中的文件,根据给定的CSV文件中包含的文件名单进行匹配。脚本生成随机文件测试程序,并处理缺失文件的统计和报告。
摘要由CSDN通过智能技术生成

# 场景

假设我们有一份需要复制的名单,名单数量多、一个一个搜、一个一个复制又太慢,刚刚好你会python,又想摸鱼应该怎么做呢?这个来看看

# 项目运行效果

1、有两个文件夹(source_fold&target_fold)文件,其中source_fold是所有文件的文件夹,target_fold为需要复制的文件夹。

2、为了实现效果,我们用代码在source_fold里先随机生成不同名字,不同类型(包含word、pdf、txt)的文件(100份),同时生成一份总的生成名单(random_name.xls)。

其中名单格式为:第一列作为需要复制的文件名单(支持模糊复制)

3、为了测试程序,在此,我们先假设你的名单就是这份包含全部文件名的csv文件的1/2,我们需要将名单里的名字找到并复制到目标文件里。

当然,直接复制很简单,假设复制完成的同时,有部分名单上有的名字但是实际文件却没有,所以为了不被老板扣工资,我们要将未找到的文件名统计出来。

同样,为了测试,我们就在名单中加入文件里不存在的名字,

在首列、中列、和后列分别加入:海绵宝宝、派大星、蟹老板、珊迪、猫猫、狗狗

4、然后运行我们的代码:

(1)选择源文件夹

(2)选择目标文件夹

(3)选择名单.csv

(4)弹窗提示完成,如果有缺失名单,则提示有loss.csv生成在target_fold文件夹里

(5)打开target_fold文件夹检查,可以看到我们已经成功根据名单搜索到对应的文件并且复制过去了!
检查loss.csv名单,显然缺失名单就是我们加入的名单

# 完整代码

#文件复制代码
#
import os
import csv
import fnmatch
import shutil
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import pandas as pd

root = tk.Tk()
root.withdraw()

# 指定源目录路径
source_directory = filedialog.askdirectory(title="选择源目录")

# 指定目标目录路径
target_directory = filedialog.askdirectory(title="选择目标文件夹")

# 指定CSV文件路径,其中包含要复制的文件名部分列表
excel_file_path = filedialog.askopenfilename(title="选择Excel文件(第一列为文件名称)",
                                             filetypes=[("Excel files", "*.xlsx")])

# 确保目标目录存在
if not os.path.exists(target_directory):
    os.makedirs(target_directory)
# 读取CSV文件中的文件名部分列表
try:
    # 使用pandas读取Excel文件
    df = pd.read_excel(excel_file_path, header=None,engine='openpyxl')
    file_patterns = df.iloc[:, 0].tolist()  # 假设第一列是文件名称
    print(file_patterns)
except FileNotFoundError:
    print(f"错误:Excel文件未找到:{excel_file_path}")
    exit(1)

# 初始化一个列表来存储未找到的文件名
not_found_files = []

# 获取源目录中所有文件的列表
try:
    source_files = os.listdir(source_directory)
except FileNotFoundError:
    print(f"错误:源目录未找到:{source_directory}")
    exit(1)

# 遍历文件名模式列表,复制匹配的文件
for pattern in file_patterns:
    print(f"正在搜索与模式匹配的文件:{pattern}")
    # 检查源目录中的文件是否与模式匹配
    matched_files = fnmatch.filter(source_files, f'*{pattern}*')
    if not matched_files:
        not_found_files.append(pattern)
    for filename in matched_files:
        # 构建源文件和目标文件的完整路径
        source_file = os.path.join(source_directory, filename)
        target_file = os.path.join(target_directory, filename)

        # 复制文件
        try:
            shutil.copy2(source_file, target_file)
            print(f"文件已复制:{source_file} -> {target_file}")
        except FileNotFoundError:
            not_found_files.append(filename)
            print(filename)  # 如果源文件未找到,添加到未找到列表
        except PermissionError:
            print(f"错误:没有权限访问文件:{source_file}")
        except shutil.SameFileError:
            print(f"错误:源文件和目标文件相同:{source_file}")
        except Exception as e:
            print(f"错误:{e}")

# 输出未找到的文件名
if not_found_files:
    print("以下文件未找到或未匹配任何模式:")
    loss_file = os.path.join(target_directory, "loss.csv")
    with open(loss_file, 'wt', newline='', encoding='utf-8', errors='ignore') as csv_file:
        csv_writer = csv.writer(csv_file)
        for filename in not_found_files:
            csv_writer.writerow([filename])
            print(filename)
    messagebox.showinfo("提示!", "丢失名单loss.csv已生成在target_files目录下")

print("复制过程完成。")

root.destroy()
messagebox.showinfo("提示", "程序已完成!已复制!")
# 生成随机文件代码
import random
import csv
import os

# 指定文件夹路径
folder_path = '自己文件夹的路径'

# 确保文件夹存在
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

# 定义一个函数来生成随机中文名字
def generate_random_chinese_name():

    chinese_names = chinese_names = [
    '赵', '钱', '孙', '李', '周', '吴', '郑', '王',
    '陈', '林', '张', '刘', '黄', '杨', '吴', '金',
    '徐', '胡', '郭', '何', '高', '马', '罗', '梁',
    '宋', '谢', '唐', '韩', '戴', '范', '汪', '孔',
    '韦', '沈', '朱', '尤', '许', '蔡', '邹', '鲁',
    '季', '马', '胡', '陈', '林', '张', '刘', '黄',
    '杨', '吴', '金', '徐', '胡', '郭', '何', '高',
    '马', '罗', '梁', '宋', '谢', '唐', '韩', '戴',
    '范', '汪', '孔', '韦', '沈', '朱', '尤', '许',
    '蔡', '邹', '鲁', '季', '马', '胡', '陈', '林',
    '张', '刘', '黄', '杨', '吴', '金', '徐', '胡',
    '郭']
    return random.choice(chinese_names) + random.choice(chinese_names)

# 创建CSV文件和写入随机中文名字
csv_file_path = os.path.join(folder_path, 'random_names.csv')
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    for _ in range(100):  # 假设我们想要生成10个随机中文名字
        name = generate_random_chinese_name()
        csv_writer.writerow([name])
        print(f"生成中文名字:{name}")

# 创建具有相同名字的PDF、Word和TXT文件
with open(csv_file_path, 'r', encoding='utf-8') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        name = row[0]
        choose = random.randint(1,3)
        if choose == 1:
            # 创建PDF文件
            pdf_file_path = os.path.join(folder_path, name + '实习报告.pdf')
            with open(pdf_file_path, 'wb') as pdf_file:
                # 这里可以添加一些内容到PDF文件,或者保持文件为空
                print(f"创建PDF文件:{pdf_file_path}")
        if choose == 2:
            # 创建Word文件
            doc_file_path = os.path.join(folder_path, '实习报告'+name + '.docx')
            with open(doc_file_path, 'wb') as doc_file:
                # 这里可以添加一些内容到Word文件,或者保持文件为空
                print(f"创建Word文件:{doc_file_path}")
        if choose == 3:
            # 创建TXT文件
            txt_file_path = os.path.join(folder_path, name + '报告实习.txt')
            with open(txt_file_path, 'w', encoding='utf-8') as txt_file:
                # 这里可以添加一些内容到TXT文件,或者保持文件为空
                print(f"创建TXT文件:{txt_file_path}")

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值