Я пытаюсь написать функцию, которая принимает данные и имя файла в качестве аргументов, причем первые являются данными, которые должны быть сохранены под именем последнего. Я хотел бы сохранить это внутри функции и не прибегать к пониманию списка, как я сделал, чтобы OutWriter3 работал через test3.

import numpy as np
import pandas as pd

data_a = np.random.randint(100, size=21)
data_b = np.random.randint(200, size=21)

def OutWriter1(data, filename):
    for d, f in zip(data, filename):
        out = pd.DataFrame(d)
        return out.to_excel(f, header=False, index=False)

def OutWriter2(data, filename):
    out = []
    for d, f in zip(data, filename):
        df = pd.DataFrame(d)
        out.append(df)
        out = pd.DataFrame(out)
        return out.to_excel(f, header=False, index=False)

def OutWriter3(data, filename):
    out = pd.DataFrame(data)
    return out.to_excel(filename, header=False, index=False)

test1 = OutWriter1([data_a, data_b], ['data_a_1.xlsx', 'data_b_1.xlsx'])
test2 = OutWriter2([data_a, data_b], ['data_a_2.xlsx', 'data_b_2.xlsx'])
test3 = [OutWriter3(i, j) for i, j in zip([data_a, data_b], ['data_a_3.xlsx', 'data_b_3.xlsx'])]

data_a_1.xlsx из OutWriter1 верно, но data_b_1.xlsx не существует, data_a_2.xlsx полностью неверно и data_b_2.xlsx также не существует. Однако data_a_3.xlsx и data_b_3.xlsx верны.

Вдохновленный другим вопросом, я также попытался сэкономить data_a и data_b в виде листов в одном файле Excel безуспешно (AttributeError: 'list' object has no attribute 'write').

def OutWriter4(data, filename):
    data = pd.DataFrame(data)
    with pd.ExcelWriter(filename) as writer:
        for n, df in enumerate(data):
            df.to_excel(writer, 'sheet%s' % n)
        writer.save()

test4 = OutWriter4([data_a, data_b], ['data_a_4.xlsx', 'data_b_3.xlsx'])
  • Есть ли элегантный способ создать функцию, которая создает файлы Excel с указанием данных и имени файла?
  • Есть ли еще элегантный способ создать функцию, которая записывает разные данные на назначенные листы в одном файле Excel?
0
naughty_waves 18 Апр 2020 в 19:35

1 ответ

Лучший ответ

Решение

Вы можете использовать следующий код для записи нескольких фреймов данных в один файл Excel или каждого из фреймов данных в один файл Excel.

target = 'single_file.xlsx'
targets = ['mult_1.xlsx', 'mult_2.xlsx', 'mult_3.xlsx']
# df1 = pd.DataFrame(data_a)
# df2 = pd.DataFrame(data_b)
# df3 = pd.DataFrame(data_c)
# dfs = [pd.DataFrame(x) for x in [data_a, data_b]] # >> in your case
dfs = [df1, df2, df3]

# to write to a single file
write_to_excel(targets = target, dfs = dfs, verbose=1)

# to write to multiple files
write_to_excel(targets = targets, dfs = dfs, verbose=1)

Пользовательская функция

def write_to_excel(targets, dfs: list, verbose=1):
    """Writes single of multiple dataframes to either a single or multiple excel files.

    targets: str or list of str --> path(s) excel files
    dfs: list of dataframes
    Example
    -------
    target = 'single_file.xlsx'
    targets = ['mult_1.xlsx', 'mult_2.xlsx', 'mult_3.xlsx']
    dfs = [df1, df2, df3]

    # to write to a single file
    write_to_excel(targets = target, dfs = dfs, verbose=1)

    # to write to a multiple files
    write_to_excel(targets = targets, dfs = dfs, verbose=1)
    """
    if not isinstance(targets, list):
        targets = [targets]
    writer_scheme = 'single' if len(target)==1 else 'multi'
    if verbose>=1:
        print(f'excel-writer-scheme: {writer_scheme}-file(s)')
    if writer_scheme == 'single':
        with pd.ExcelWriter(targets[0]) as writer:
            for i, df in enumerate(dfs):  
                df.to_excel(writer, sheet_name=f'Sheet_{i+1}')
    else:
        for df, target in zip(dfs, targets):
            df.to_excel(target, sheet_name='data')

Ссылки

  1. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html
2
CypherX 19 Апр 2020 в 23:05