Я пытаюсь написать функцию, которая принимает данные и имя файла в качестве аргументов, причем первые являются данными, которые должны быть сохранены под именем последнего. Я хотел бы сохранить это внутри функции и не прибегать к пониманию списка, как я сделал, чтобы 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?
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')
Ссылки
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.