【问题标题】:Merging multiple CSV files into separate tabs of a spreadsheet in Python在 Python 中将多个 CSV 文件合并到电子表格的单独选项卡中
【发布时间】: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 以合并电子表格的单独选项卡。它提供了更高的可读性和易于实现。

标签: python excel python-3.x python-2.7 pandas


【解决方案1】:

这里有两个问题:

  1. 您的生成器表达式允许您懒惰地迭代数据框对象。您不能将生成器表达式导出到 Excel 文件。
  2. 您的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='data{0}.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 是用户用于合并的方向

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 2020-09-16
        • 2016-10-10
        • 2013-07-13
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        相关资源
        最近更新 更多