【问题标题】:Iterating over folder to get csv files and merge them to separate sheets in excel遍历文件夹以获取 csv 文件并将它们合并到 Excel 中的单独工作表中
【发布时间】:2021-10-09 11:10:47
【问题描述】:

我正在尝试编写一个简短的脚本,该脚本将识别文件夹结构中的所有 csv 文件,然后将每个文件放入单独的工作表中,并为它们提供父文件夹名称。

这是我尝试过的:

import pandas as pd
import os as os
import xlsxwriter
import openpyxl

input_dir = r"C:\..."

for root, dirs, files in os.walk(input_dir):
    for file in files:
        df = []
        if file.endswith('{}'.format('csv')):
                writer = pd.ExcelWriter(out.xlsx,
                                    engine='xlsxwriter')
            sheet_name = os.path.join(root.split('\\')[6], root.split('\\')[7])
            new_name = sheet_name.replace('\\', '-')
            df = pd.read_csv(os.path.join(root, file))
            df.to_excel(writer, sheet_name=new_name, index=False)
            writer.save()

它确实将 csv 插入到 xlsx 并给出正确的名称,但它每次都会覆盖数据,我只得到文件夹中的最后一个 csv。

有什么建议吗?

谢谢

【问题讨论】:

  • 如果同一个文件夹中有多个 csv,它们将被赋予相同的名称(因为您的名称是基于父文件夹的),因此会相互覆盖,因为工作表名称必须是唯一的。当同一个文件夹中有多个 csv 文件时,你想发生什么?
  • 您的主要问题是您每次创建writer 对象实际上是在每次迭代中编写一个新的excel。正如@AlfredRodenboog 所说,您需要概述在单个父文件夹中处理多个 CSV 的规则。
  • 同一个文件夹中没有多个 cvs。每个文件夹只有 1 个

标签: python excel pandas csv


【解决方案1】:

在循环外创建编写器:

import pandas as pd
import os as os
import xlsxwriter
import openpyxl

input_dir = r"C:\..."

writer = pd.ExcelWriter(out.xlsx, engine='xlsxwriter')

for root, dirs, files in os.walk(input_dir):
    for file in files:
        df = []
        if file.endswith('{}'.format('csv')):
            sheet_name = os.path.join(root.split('\\')[6], root.split('\\')[7])
            new_name = sheet_name.replace('\\', '-')
            df = pd.read_csv(os.path.join(root, file))
            df.to_excel(writer, sheet_name=new_name, index=False)
            writer.save()

【讨论】:

    【解决方案2】:

    我们可以将 pathlib 与 pandas 结合使用。

    from pathlib import Path
    import pandas as pd 
    
    start_dir = 'C:\...'
    
    files = Path(start_dir).rglob('*.csv') # finds all child csvs. 
    
    #writer object outside loop. 
    writer = pd.ExcelWriter(r"C:\Users\Omer Davidi\Downloads\dry+breath\dry+breath\out.xlsx",
                                    engine='xlsxwriter')
    
    
    for file in files:
        df = pd.read_csv(file)
        df.to_excel(writer,sheet_name=file.parent.name,index=False)
    
    # save object after iteration ends.
    writer.save() 
    

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多