不再手动复制和粘贴!Python整合海量Excel的最佳实践

假设你面对着一个庞大的文件军团(5000个excel),分散在各个文件夹里,而你的任务是将它们集结到一个统一的文件夹中。听起来像是一个费时费力的工作吗?不要担心,Python就是你的超能力!让我向你展示如何利用Python,在短短几分钟内完成这个看似不可能的任务。

先打个底:以理解为主,不够严谨,如果看完还是不会,那一定是我讲的不够好,千万别影响你们探索Python的兴趣。

思路解析

  • 首先,我们要使用一个循环来遍历这5000个文件所在的不同文件夹;
  • 然后,对于每个文件,我们用Python将它们轻松复制到一个统一的文件夹中,但是,注意了!如果目标文件夹中已经存在了同名文件,我们不能让它们相互踩脚。我们需要一点点创意,给每个重复的文件名后面加上一个独特的标记;
  • 最后,我们只需执行程序,就将以闪电般的速度完成这5000个文件的整理工作,同时,它会在日志中展示每个文件的复制过程;

开始之前,先讲下我们这次用到几个知识点

1.Python中文件复制的核心函数是shutil.copy2(),它可以复制文件的内容、权限和元数据。在Python中,同时也提供了shutil.copy()函数,但它只能复制文件的内容,无法保留文件的权限和元数据。
2.Python中遍历目录树的循环代码。
for root, dirs, files in os.walk(source_folder):

os.walk()函数接受一个文件夹路径source_folder作为输入,并返回一个可迭代对象。在每次迭代中,它会返回一个三元组 (root, dirs, files),分别为当前文件夹、子文件夹、文件列表。其中root 是当前目录的路径,dirs 是当前目录中的子文件夹列表,files 是当前目录中的文件列表。
假设我们的根目录是/home/xusl/test_data,目录下有3个文件夹,如下图所示

  • root :/home/xusl/test_data
  • dirs:['新建文件夹3', '新建文件夹2', '新建文件夹1']
  • files:['新建文本文档.txt']

下次循环子目录内容,此时循环的是新建文件夹3,文件夹下有3个目录,分别是文件夹3目录1、 文件夹3目录、文件夹3目录3

  • root:/home/xusl/test_data/新建文件夹3
  • dirs:['文件夹3目录1', '文件夹3目录2', '文件夹3目录3']
  • files:[]

完整代码:

"""
Created on 2024/1/22
@title: ''
@author: Xusl
"""
import os
import shutil
import logging.config


_tb_nm = 'excel日志数据'
_tb_nm_cn = "excel日志数据"
_service_code = _tb_nm
# 日志目录
log_home = '/home/xusl/test_data'

# 日志level
log_level = logging.INFO

# 日志打印到控制台
log_to_console = True


log_config = {
    'version': 1,
    'formatters': {
        'generic': {
            'format': '%(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s',
        },
        'simple': {
            'format': '%(asctime)s %(levelname)-5.5s %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'generic',
        },
        'file': {
            'class': 'logging.FileHandler',
            'filename': os.path.join(log_home, _tb_nm + '.log'),
            'encoding': 'utf-8',
            'formatter': 'generic',

        },
    },
    'root': {
        'level': log_level,
        'handlers': ['console', 'file', ] if log_to_console else ['file', ],
    }
}
logging.config.dictConfig(log_config)
logger = logging.getLogger(_tb_nm)


source_folder = '/home/xusl/test_data'                # 需要处理的文件夹路径
destination_folder = '/home/xusl/test_data/end'        # 保存路径

# 重名文件覆盖
# for root, dirs, files in os.walk(source_folder):
#     for file in files:
#         if file.endswith(".xlsx"):
#             source_path = os.path.join(root, file)
#             destination_path = os.path.join(destination_folder, file)
#             if not os.path.exists(destination_path):
#                 # 若目标文件不存在,直接复制
#                 print(f"Copying: {source_path} -> {destination_path}")
#                 shutil.copy(source_path, destination_folder)
#             else:
#                 # 若目标文件已存在,保留原有文件
#                 print(f"Duplicate found: {source_path}")


# 重名文件不覆盖
for root, dirs, files in os.walk(source_folder):
    #对于每个文件 file 在当前目录中的循环。
    for file in files:
        # if file.endswith(".xlsx"):  # 只处理excel文件,可放开注释
        # if file.endswith(".txt"):
        # 使用 os.path.join() 函数将目标文件夹路径 destination_folder 和文件名 file 连接起来,创建完整的目标文件路径 destination_path。
        source_path = os.path.join(root, file)
        destination_path = os.path.join(destination_folder, file)
        counter = 1
        # os.path.exists() 函数用于检查给定路径是否存在。
        while os.path.exists(destination_path):
            # 若目标文件已存在,添加后缀或编号
            file_name, file_ext = os.path.splitext(file)
            new_file_name = f"{file_name}_{counter}{file_ext}"
            destination_path = os.path.join(destination_folder, new_file_name)
            counter += 1
        logging.info(f"Copying: {source_path} -> {destination_path}")
        shutil.copy2(source_path, destination_path)

在循环中,我们使用os.path.splitext() 函数将文件名 file 拆分成文件名部分和扩展名部分。然后,我们创建一个新的文件名 new_file_name,在原始文件名后面添加一个下划线和计数器的值。最后,我们使用 os.path.join() 函数将目标文件夹路径 destination_folder 和新文件名 new_file_name 连接起来,更新目标文件路径 destination_path。计数器 counter 逐渐递增,直到找到一个不存在的目标文件路径。

如果看完以后还是不懂,没关系,只需要电脑配置Python环境,同时更改代码的三处目录即可执行,分别是

  • log_home:日志目录
  • source_folder:需要处理的文件夹路径
  • destination_folder:保存路径

写到最后,我真心希望大家都能学习Python,对于一些业务分析人员来说,掌握Python就可以轻松地提取、清洗和分析海量的数据,将繁琐的任务简化为几行代码。无论是数据分析、报告生成还是自动化处理,Python都能成为你最强大的助手。

同时不管你是从零开始还是已经有一定编程基础,Python都是一个友善且易于学习的语言。借助丰富的开源库和社区支持,你将能够快速提升自己的技能,为职场发展打下坚实的基础。

相信我,学习Python处理Excel文件不仅能够提高工作效率,还能为你带来更多的机会和可能性。所以一起努力,用Python的魔力开启新的职业篇章吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容