# 场景
假设我们有一份需要复制的名单,名单数量多、一个一个搜、一个一个复制又太慢,刚刚好你会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}")