J'ai un code qui génère plusieurs fichiers CSV dans un répertoire. Je souhaite générer un rapport dans Excel contenant les fichiers CSV sous forme d'onglets distincts. J'ai utilisé le code ci-dessous pour le même:
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()
Mais cela donne l'erreur ci-dessous: AttributeError: l'objet 'générateur' n'a pas d'attribut 'to_Excel' Je ne sais pas trop où je me trompe. Dois-je importer une bibliothèque spécifique pour résoudre le problème?
La version Python est 2.7
Il y a deux problèmes ici:
sheet_name
est une constante. Pour exporter vers plusieurs feuilles de calcul, vous devez spécifier un nom différent pour chaque feuille de calcul.Vous pouvez utiliser une simple boucle for
à cette fin:
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))
Vos feuilles de calcul s'appelleront data0.csv
, data1.csv
, etc. Si vous avez besoin du nom de fichier comme nom de feuille, vous pouvez restructurer votre logique et utiliser le module os
pour extraire le nom de fichier à partir du chemin:
import os
for f in all_files:
df = pd.read_csv(f)
df.to_Excel(writer, sheet_name=os.path.basename(f))
vous pouvez utiliser la méthode des pandas concat
csv1 = pd.read_csv(csv1_file_path)
csv2 = pd.read_csv(csv2_file_path)
merge_csv = pd.concat((csv1, csv2), axis=0)
axe est l'utilisateur pour la fusion dans quelles directions
Bien que Python nécessite beaucoup moins de lignes de code que VBA, j'utiliserais probablement VBA pour ce type de tâche.
' 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