如何快速使用Pandas读取多个包含多个工作表的Excel文件?

2024-05-12 12:58:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试读取多个excel文件,每个文件都包含多个选项卡。我的代码可以工作,但是输出最终的数据帧需要很长时间。我如何优化我的代码,使我不等待30分钟得到最终产品?你知道吗

为了节省时间,我试图限制读取到循环中的表和文件。我知道以csv格式读取文件可以节省时间,但是,将excel文件转换为csv会使它只包含第一个选项卡。也许有一种方法可以将这些表格转换成csv并以这种方式阅读,但我不知道如何做到这一点。你知道吗

import pandas as pd
import glob
import numpy as np


invoicelist = glob.glob('*.xlsx')
invoicelist = pd.Series(invoicelist)
invoicelist1 = invoicelist[~invoicelist.str.contains('Analysis|Errors|M&T|MGMT|MT', case = False)]

invoice = pd.DataFrame()   


for f in invoicelist1:
    x = pd.ExcelFile(f)
    sheets = x.sheet_names
    sheets1 = pd.Series(sheets)
    sheets1 = sheets1[~sheets1.str.contains('Summary|sheet', case = False)]
    sheets2 = sheets1.tolist()
    for sheet in sheets2:
        newdf = x.parse(sheet)
        newdf['Sheet'] = sheet
        newdf['File'] = f
        invoice = invoice.append(newdf, ignore_index = True)

就像我说的,代码工作并输出一个包含所有必要数据的数据帧。然而,这样做需要很长时间。我能做些什么来加速这个过程?你知道吗


Tags: 文件csv数据代码importinvoiceexcelglob
1条回答
网友
1楼 · 发布于 2024-05-12 12:58:28

我建议直接使用pd.concatpd.read_excel,如下所示:

invoicelist = glob.glob('*.xlsx')
invoicelist = pd.Series(invoicelist)
invoicelist1 = invoicelist[~invoicelist.str.contains('Analysis|Errors|M&T|MGMT|MT', case = False)]
sheetnames = ['sheet_1', 'sheet_2', 'sheet_3', 'sheet_4']

df = pd.concat([pd.read_excel(file_path, sheet_name=sheetname)
               for file_path in invoicelist1
               for sheetname in sheetnames])

需要注意的是,您应该在上手之前知道表名的索引或名称。如果是这样,我建议采用暴力方法:

df_list = []
for file_path in invoicelist1:
    i=0
    while True:
        try:
            df_list.append(pd.read_excel(file_path, sheet_name=i))
            i+=1
        except IndexError:
            break

df = pd.concat(df_list)

但同样,暴力是有效的,但表现不好,这否定了你的最终目标。你知道吗

相关问题 更多 >