在 Python 中将多个 CSV 文件合并到电子表格的单独选项卡中

Posted

技术标签:

【中文标题】在 Python 中将多个 CSV 文件合并到电子表格的单独选项卡中【英文标题】:Merging multiple CSV files into separate tabs of a spreadsheet in Python 【发布时间】:2019-01-28 13:06:53 【问题描述】:

我有一个代码可以在一个目录中生成多个 CSV 文件。我想在 excel 中生成一个报告,该报告将包含 CSV 文件作为单独的选项卡。 我已经使用了以下代码:

import pandas as pd
import os
import csv
import glob    
path = "/MyScripts"
all_files = glob.glob(os.path.join(path, "*.csv"))
df_from_each_file = (pd.read_csv(f) for f in all_files)
df_from_each_file.to_excel(writer, sheet_name='ReturnData.csv')
writer.save()

但它给出了以下错误: AttributeError: 'generator' 对象没有属性 'to_excel' 不知道我哪里出错了。我需要导入任何特定的库来解决问题吗?

Python 版本为 2.7

【问题讨论】:

您可能想查看 xlswriter 以合并电子表格的单独选项卡。它提供了更高的可读性和易于实现。 【参考方案1】:

这里有两个问题:

    您的生成器表达式允许您懒惰地迭代数据框对象。您不能将生成器表达式导出到 Excel 文件。 您的sheet_name 参数是一个常数。要导出到多个工作表,您需要为每个工作表指定不同的名称。

您可以为此目的使用一个简单的for 循环:

writer = pd.ExcelWriter('out.xlsx', engine='xlsxwriter')
df_from_each_file = (pd.read_csv(f) for f in all_files)

for idx, df in enumerate(df_from_each_file):
    df.to_excel(writer, sheet_name='data0.csv'.format(idx))

writer.save()

您的工作表将被命名为data0.csvdata1.csv 等。如果您需要文件名作为工作表名称,您可以重新构建逻辑并使用os 模块从路径中提取文件名:

import os

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

for f in all_files:
    df = pd.read_csv(f)
    df.to_excel(writer, sheet_name=os.path.basename(f))

writer.save()

【讨论】:

这非常有用。非常感谢@JPP 什么是作家? 这对我不起作用不写任何东西 @Maths12,别忘了通过writer.save() 保存。请参阅documentation。【参考方案2】:

这里是来自 jpp 解决方案的完整源代码:

import os
import pandas as pd
import glob

path = './'
all_files = glob.glob(os.path.join(path, "*.csv"))

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

for f in all_files:
    df = pd.read_csv(f)
    df.to_excel(writer, sheet_name=os.path.splitext(os.path.basename(f))[0], index=False)

writer.save()

【讨论】:

【参考方案3】:

虽然与 VBA 相比,Python 需要的代码行数要少得多,但我可能会使用 VBA 来完成此类任务。

' Merge data from multiple sheets into separate sheets
Sub R_AnalysisMerger2()
    Dim WSA As Worksheet
    Dim bookList As Workbook
    Dim SelectedFiles As Variant
    Dim NFile As Long
    Dim FileName As String
    Dim Ws As Worksheet, vDB As Variant, rngT As Range
    Dim vFn, myFn As String

    Application.ScreenUpdating = False

    SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True)
    If IsEmpty(SelectedFiles) Then Exit Sub

    For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
        FileName = SelectedFiles(NFile)
        vFn = Split(FileName, "\")
        myFn = vFn(UBound(vFn))
        myFn = Replace(myFn, ".csv", "")
        Set bookList = Workbooks.Open(FileName, Format:=2)
        Set WSA = bookList.Sheets(1)
        vDB = WSA.UsedRange
        bookList.Close (0)
        Set Ws = Sheets.Add(after:=Sheets(Sheets.Count))
        ActiveSheet.Name = myFn
        Ws.Range("a1").Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB
    Next
    Application.ScreenUpdating = True

End Sub

' Merge data from multime files into one sheet.
Sub R_AnalysisMerger()
    Dim WSA As Worksheet
    Dim bookList As Workbook
    Dim SelectedFiles() As Variant
    Dim NFile As Long
    Dim FileName As String
    Dim Ws As Worksheet, vDB As Variant, rngT As Range

    Application.ScreenUpdating = False


    Set Ws = ThisWorkbook.Sheets(1)
    Ws.UsedRange.Clear
    'change folder path of excel files here
    SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True)


    For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
        FileName = SelectedFiles(NFile)
        Set bookList = Workbooks.Open(FileName, Format:=2)
        Set WSA = bookList.Sheets(1)
        With WSA
            vDB = .UsedRange
            Set rngT = Ws.Range("a" & Rows.Count).End(xlUp)(2)
            If rngT.Row = 2 Then Set rngT = Ws.Range("a1")
            rngT.Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB

            bookList.Close (0)
        End With
    Next
    Application.ScreenUpdating = True
    Ws.Range("A1").Select

End Sub

【讨论】:

【参考方案4】:

你可以使用 pandas concate 方法

csv1 = pd.read_csv(csv1_file_path)
csv2 = pd.read_csv(csv2_file_path)

merge_csv = pd.concat((csv1, csv2), axis=0)

axis 是用户用于合并的方向

【讨论】:

以上是关于在 Python 中将多个 CSV 文件合并到电子表格的单独选项卡中的主要内容,如果未能解决你的问题,请参考以下文章

Python pandas - 将具有多个日期索引的csv合并到单个日期索引

如何通过在 Python 中将两个列表合并为一个,使用 CSV 模块或 Pandas 写入 csv 或 Excel 文件?

使用 Python 组合多个 CSV 文件

根据特定列合并多个 CSV 文件 - Python

如何在Python中垂直合并几个csv文件?

Python实战系列将多个CSV文件合并到Excel的多个sheet