鱼C论坛

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

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

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

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

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

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

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

  7.     fname=i.split("\")[-1]
  8.     fname=fname.split(".")[0]
  9.     print(fname)
  10.     df.to_excel(writer, sheet_name=fname, index = False)
  11. writer._save()
复制代码
最佳答案
2024-12-24 15:36:47

  1. import glob
  2. import pandas as pd
  3. from multiprocessing import Pool

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

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

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

  18.     writer._save()

  19. if __name__ == "__main__":
  20.     main()
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-12-24 15:36:47 | 显示全部楼层    本楼为最佳答案   

  1. import glob
  2. import pandas as pd
  3. from multiprocessing import Pool

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

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

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

  18.     writer._save()

  19. if __name__ == "__main__":
  20.     main()
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

  14. writer._save()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

还有别的什么办法或者函数可以使功能更加高效,速度运行的更快速吗,希望速度运行的越快越好
小甲鱼最新课程 -> https://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`的示例代码:

  1. import glob
  2. import pandas as pd

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

  13. if __name__ == "__main__":
  14.     main()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  12.     wb = Workbook()
  13.     for fname, df in results:
  14.         ws = wb.create_sheet(title=fname)
  15.         for r in dataframe_to_rows(df, index=False, header=True):
  16.             ws.append(r)
  17.     wb.save('总结123.xlsx')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-6 06:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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