web-dev-qa-db-fra.com

Fusion de plusieurs fichiers CSV dans des onglets distincts d'une feuille de calcul en Python

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

4
Soubhik Banerjee

Il y a deux problèmes ici:

  1. Votre expression de générateur vous permet de parcourir paresseusement des objets de type données. Vous ne pouvez pas exporter une expression de générateur dans un fichier Excel.
  2. Votre paramètre 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))
3
jpp

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

0
aman kumar

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
0
ryguy72