在 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.csv
、data1.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 文件?