鱼C论坛

 找回密码
 立即注册
查看: 124|回复: 6

[已解决]想要将多个excel文件中的数据合并为一个excel里面的多个sheet,想要提高效率

[复制链接]
发表于 2024-12-24 15:36:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目前想做的就是把八九个excel全部合成为一个excel文件中的多个sheet,sheet名字就是文件名,已经用pandas的循环去写好了,但是每个excel里面都有几千或者几万条数据,数据量有点儿大,想要速度快一点,试过并行,但速度好像没有怎么提高,做完将近两分多钟了,想要最好越快越好。各位鱼油大大有没有什么好点子。
import glob
import pandas as pd

writer = pd.ExcelWriter('总结123.xlsx')
flist=glob.glob(r".\result\*.xlsx")
for i in flist:
    df=pd.read_excel(i)

    fname=i.split("\")[-1]
    fname=fname.split(".")[0]
    print(fname)
    df.to_excel(writer, sheet_name=fname, index = False)
writer._save()
最佳答案
2024-12-24 15:36:47
import glob
import pandas as pd
from multiprocessing import Pool

def process_file(file):
    """读取Excel文件并返回数据和文件名"""
    df = pd.read_excel(file)
    fname = file.split("\")[-1].split(".")[0]
    return df, fname

def main():
    writer = pd.ExcelWriter('总结123.xlsx', engine='xlsxwriter')
    flist = glob.glob(r".\result\*.xlsx")

    # 使用多进程池来并行处理文件
    with Pool() as pool:
        results = pool.map(process_file, flist)
        
        for df, fname in results:
            df.to_excel(writer, sheet_name=fname, index=False)

    writer._save()

if __name__ == "__main__":
    main()

这里提供了一种基于多进程的解决方案。我们使用`multiprocessing`库的`Pool`类来并行读取Excel文件,以提高处理速度。在`process_file`函数中,我们读取每个Excel文件并返回数据和文件名。然后,在`main()`函数中,我们调用`Pool().map()`方法来并行处理文件列表。

注意:通过多进程可能并不能大幅度提升速度,特别是在I/O操作非常耗时的情况下。确保你的硬盘读写速度不成瓶颈,同时也可以尝试将Excel文件转换成其他更高效的格式进行处理。或者考虑使用批处理工具和其他支持直接读取和合并Excel文件的工具来提升效率。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-24 15:36:47 | 显示全部楼层    本楼为最佳答案   
import glob
import pandas as pd
from multiprocessing import Pool

def process_file(file):
    """读取Excel文件并返回数据和文件名"""
    df = pd.read_excel(file)
    fname = file.split("\")[-1].split(".")[0]
    return df, fname

def main():
    writer = pd.ExcelWriter('总结123.xlsx', engine='xlsxwriter')
    flist = glob.glob(r".\result\*.xlsx")

    # 使用多进程池来并行处理文件
    with Pool() as pool:
        results = pool.map(process_file, flist)
        
        for df, fname in results:
            df.to_excel(writer, sheet_name=fname, index=False)

    writer._save()

if __name__ == "__main__":
    main()

这里提供了一种基于多进程的解决方案。我们使用`multiprocessing`库的`Pool`类来并行读取Excel文件,以提高处理速度。在`process_file`函数中,我们读取每个Excel文件并返回数据和文件名。然后,在`main()`函数中,我们调用`Pool().map()`方法来并行处理文件列表。

注意:通过多进程可能并不能大幅度提升速度,特别是在I/O操作非常耗时的情况下。确保你的硬盘读写速度不成瓶颈,同时也可以尝试将Excel文件转换成其他更高效的格式进行处理。或者考虑使用批处理工具和其他支持直接读取和合并Excel文件的工具来提升效率。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-24 15:40:00 | 显示全部楼层
import glob
import pandas as pd
from concurrent.futures import ThreadPoolExecutor

def process_file(file_path, writer):
    df = pd.read_excel(file_path)
    fname = file_path.split("\")[-1].split(".")[0]
    df.to_excel(writer, sheet_name=fname, index=False)

writer = pd.ExcelWriter('总结123.xlsx')
flist = glob.glob(r".\result\*.xlsx")

with ThreadPoolExecutor(max_workers=4) as executor:
    futures = [executor.submit(process_file, file, writer) for file in flist]
    for future in futures:
        future.result()  # 确保所有任务完成

writer._save()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-24 16:02:32 | 显示全部楼层

非常感谢哥,确实要快了一些,比我的要好,但是感觉还是不够快,我处理了一遍我的数据还是需要一份四十多,就是还想再快一点,最好能在一分出头那种感觉,还有什么更快一些的逻辑或者好用的库嘛哥。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-24 16:31:49 | 显示全部楼层
FishC 发表于 2024-12-24 15:36
这里提供了一种基于多进程的解决方案。我们使用`multiprocessing`库的`Pool`类来并行读取Excel文件,以 ...

还有别的什么办法或者函数可以使功能更加高效,速度运行的更快速吗,希望速度运行的越快越好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-24 16:44:31 | 显示全部楼层
神兽坤坤 发表于 2024-12-24 16:31
还有别的什么办法或者函数可以使功能更加高效,速度运 ...


你可以尝试使用以下方法来提高Excel文件操作的效率:

1. **使用`openpyxl`库**:`pandas`默认使用`xlrd`来读取Excel文件,这可能在处理大型文件时效率不高。`openpyxl`可以作为替代,它是一个专门为Excel提供高效读写支持的库。可以通过设置`engine='openpyxl'`来使用这个库。

2. **减少数据处理步骤**:如果可能的话,尽量减少对数据的处理,比如删除不必要的数据列,或在读取时直接指定需要的列。

3. **批量读取数据**:如果文件非常大,可以考虑分批读取数据,比如通过`chunk_size`参数来读取数据块,以避免内存占用过高。

4. **使用更高效的文件格式**:将数据从Excel转换为更高效的格式(例如CSV、Parquet等)进行处理。之后再根据需要转换回Excel格式,如果必要的话。

以下是使用`openpyxl`的示例代码:
import glob
import pandas as pd

def main():
    writer = pd.ExcelWriter('总结123.xlsx', engine='openpyxl')
    flist = glob.glob(r".\result\*.xlsx")
    
    for file in flist:
        df = pd.read_excel(file, engine='openpyxl')
        fname = file.split("\")[1].split(".")[0]
        df.to_excel(writer, sheet_name=fname, index=False)
    
    writer.save()

if __name__ == "__main__":
    main()

尝试压缩数据量、使用更快的库,这些方法都可以有助于提高速度和效率。需要注意的是,提升效率的效果和数据结构及文件大小等因素密切相关,所以可能需要进行多次尝试和测试,选择最合适的方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-24 17:32:10 | 显示全部楼层
神兽坤坤 发表于 2024-12-24 16:02
非常感谢哥,确实要快了一些,比我的要好,但是感觉还是不够快,我处理了一遍我的数据还是需要 ...
import glob
from multiprocessing import Pool
from openpyxl import Workbook

def process_file(file_path):
    df = pd.read_excel(file_path)
    fname = file_path.split("\")[-1].split(".")[0]
    return fname, df

if __name__ == '__main__':
    flist = glob.glob(r".\result\*.xlsx")
    with Pool(processes=4) as pool:
        results = pool.map(process_file, flist)

    wb = Workbook()
    for fname, df in results:
        ws = wb.create_sheet(title=fname)
        for r in dataframe_to_rows(df, index=False, header=True):
            ws.append(r)
    wb.save('总结123.xlsx')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-24 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表