【问题标题】:Importing multiple exce files including sheets into 1 excel file将包括工作表在内的多个 excel 文件导入 1 个 excel 文件
【发布时间】:2020-08-11 19:29:20
【问题描述】:

我有 5 个 Excel 文件,每个文件包含 8 个工作表,每个工作表包含大约 30 行。所以这意味着 1 个文件总共有 30 x 8 = 240 行。有没有什么快速的技巧可以将所有这 5 个文件(包括工作表)合并到 1 个 Excel 文件中,总共 240 x 5 行 = 1200 行?

这是我当前的代码:

import os
import pandas as pd

files = os.listdir('c:\data\KM\Desktop\my_folder') 
 
os.chdir(r'c:\data\KM\Desktop\my_folder')

df = pd.DataFrame()

for file in files:
    if file.endswith('.xlsx'):
        df = df.append(pd.read_excel(file))
df.head() 
df.to_excel('all_files.xlsx')  

现在使用这段代码我有两个问题:

  1. 从所有文件中,我只得到了第一张。所以它总共合并了 8 张而不是 40 (8x5) :(
  2. 对于每个文件,它还复制列标题,这需要仅针对第一个文件进行。所有文件和工作表都具有相同的列名。

感谢大家的帮助。

【问题讨论】:

    标签: python excel pandas python-os


    【解决方案1】:

    对所有工作表使用read_excelsheet_name=None,通过concat 连接在一起作为DataFrame 列表,最后再次将它用于一个大DataFrame:

    import glob
    
    files = glob.glob(r'c:/data/KM/Desktop/my_folder/*.xlsx') 
    dfs = (pd.concat(pd.read_excel(fp, sheet_name=None)) for fp in files)
    dfbig = pd.concat(dfs, ignore_index=True)
    

    编辑:对于删除最后一个工作表名,将 orderdict 转换为 DataFrame 列表并通过索引删除最后一个:

    files = glob.glob(r'D:/Dropbox/work-joy/so/files/*.xlsx')
    dfs = (pd.concat([v for k, v in pd.read_excel(fp, sheet_name=None).items()][:-1]) 
                     for fp in files)
    df = pd.concat(dfs, ignore_index=True)
    

    【讨论】:

    • 啊哈这太棒了!谢谢你。 2个问题。 1.它仍然复制每张纸的所有列。如何摆脱它? 2. 是否也可以排除工作表?
    • @Premier12 - 排除的工作表名称是什么?
    • 不同的名称,对于我需要排除最新文件的每个文件。他们都有不同的名字。
    • @Premier12 - 你认为最新的工作表名称吗?
    • 不,我 100% 确定它是每个文件的最后一张。
    猜你喜欢
    • 2014-01-29
    • 2021-01-27
    • 2016-04-17
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多