Actualmente tengo este código. Funciona perfectamente

Recorre los archivos de Excel en una carpeta, elimina las primeras 2 filas, luego los guarda como archivos de Excel individuales, y también guarda los archivos en el bucle como un archivo adjunto.

Actualmente, el archivo adjunto sobrescribe el archivo existente cada vez que ejecuto el código.

Necesito agregar los nuevos datos al final de la hoja de Excel ya existente ('master_data.xlsx)

dfList = []
path = 'C:\\Test\\TestRawFile' 
newpath = 'C:\\Path\\To\\New\\Folder'

for fn in os.listdir(path): 
  # Absolute file path
  file = os.path.join(path, fn)
  if os.path.isfile(file): 
    # Import the excel file and call it xlsx_file 
    xlsx_file = pd.ExcelFile(file) 
    # View the excel files sheet names 
    xlsx_file.sheet_names 
    # Load the xlsx files Data sheet as a dataframe 
    df = xlsx_file.parse('Sheet1',header= None) 
    df_NoHeader = df[2:] 
    data = df_NoHeader 
    # Save individual dataframe
    data.to_excel(os.path.join(newpath, fn))

    dfList.append(data) 

appended_data = pd.concat(dfList)
appended_data.to_excel(os.path.join(newpath, 'master_data.xlsx'))

Pensé que sería una tarea simple, pero supongo que no. Creo que necesito traer el archivo master_data.xlsx como un marco de datos, luego hacer coincidir el índice con los nuevos datos agregados y guardarlo de nuevo. O tal vez hay una manera más fácil. Cualquier ayuda es apreciada.

26
brandog 28 jun. 2016 a las 14:14

3 respuestas

La mejor respuesta

Una función auxiliar para agregar DataFrame al archivo Excel existente :

def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None,
                       truncate_sheet=False, 
                       **to_excel_kwargs):
    """
    Append a DataFrame [df] to existing Excel file [filename]
    into [sheet_name] Sheet.
    If [filename] doesn't exist, then this function will create it.

    Parameters:
      filename : File path or existing ExcelWriter
                 (Example: '/path/to/file.xlsx')
      df : dataframe to save to workbook
      sheet_name : Name of sheet which will contain DataFrame.
                   (default: 'Sheet1')
      startrow : upper left cell row to dump data frame.
                 Per default (startrow=None) calculate the last row
                 in the existing DF and write to the next row...
      truncate_sheet : truncate (remove and recreate) [sheet_name]
                       before writing DataFrame to Excel file
      to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
                        [can be dictionary]

    Returns: None
    """
    from openpyxl import load_workbook

    import pandas as pd

    # ignore [engine] parameter if it was passed
    if 'engine' in to_excel_kwargs:
        to_excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl')

    # Python 2.x: define [FileNotFoundError] exception if it doesn't exist 
    try:
        FileNotFoundError
    except NameError:
        FileNotFoundError = IOError


    try:
        # try to open an existing workbook
        writer.book = load_workbook(filename)

        # get the last row in the existing Excel sheet
        # if it was not specified explicitly
        if startrow is None and sheet_name in writer.book.sheetnames:
            startrow = writer.book[sheet_name].max_row

        # truncate sheet
        if truncate_sheet and sheet_name in writer.book.sheetnames:
            # index of [sheet_name] sheet
            idx = writer.book.sheetnames.index(sheet_name)
            # remove [sheet_name]
            writer.book.remove(writer.book.worksheets[idx])
            # create an empty sheet [sheet_name] using old index
            writer.book.create_sheet(sheet_name, idx)

        # copy existing sheets
        writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
    except FileNotFoundError:
        # file does not exist yet, we will create it
        pass

    if startrow is None:
        startrow = 0

    # write out the new sheet
    df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)

    # save the workbook
    writer.save()

Ejemplos de uso ...


Respuesta anterior: le permite escribir varios DataFrames en un nuevo archivo de Excel.

Puede usar el motor openpyxl junto con el parámetro startrow:

In [48]: writer = pd.ExcelWriter('c:/temp/test.xlsx', engine='openpyxl')

In [49]: df.to_excel(writer, index=False)

In [50]: df.to_excel(writer, startrow=len(df)+2, index=False)

In [51]: writer.save()

C: /temp/test.xlsx:

enter image description here

PD: también puede especificar header=None si no desea duplicar los nombres de columna ...

ACTUALIZACIÓN: también puede consultar esta solución

36
MaxU 16 ene. 2019 a las 15:35

Si no está buscando estrictamente un archivo de Excel, obtenga la salida como archivo csv y simplemente copie el csv a un nuevo archivo de Excel

df.to_csv('filepath', mode='a', index = False, header=None)

Modo = 'a'

Un medio anexa

¡Esta es una forma indirecta pero funciona bien!

4
David 21 oct. 2019 a las 18:35

Esta pregunta ha estado aquí por un tiempo. La respuesta está bien, pero creo que esto resolverá la pregunta de la mayoría de las personas.

Simplemente use glob para acceder a los archivos en un directorio específico, recorrerlos, crear un marco de datos de cada archivo, agregarlo al último y luego exportarlo a una carpeta. También incluí un código comentado para ejecutar esto con csvs.

import os
import pandas as pd
import glob

# put in path to folder with files you want to append
# *.xlsx or *.csv will get all files of that type
path = "C:/Users/Name/Folder/*.xlsx"
#path = "C:/Users/Name/Folder/*.csv"

# initialize a empty df
appended_data = pd.DataFrame()

#loop through each file in the path
for file in glob.glob(path):
    print(file)

    # create a df of that file path
    df = pd.read_excel(file, sheet_name = 0)
    #df = pd.read_csv(file, sep=',')

    # appened it
    appended_data = appended_data.append(df)

appended_data

# export the appeneded data to a folder of your choice
exportPath = 'C:/My/EXPORT/PATH/appended_dataExport.csv'
appended_data.to_csv(os.path.join(exportPath),index=False)
0
brandog 10 abr. 2020 a las 13:38