Python xlsxwriter: используйте цикл for для записи из нескольких списков

Я пытаюсь изучить Python и столкнулся с проблемой записи в файл excel с помощью модуля xlsxwriter с использованием нескольких списков.

У меня есть 4 списка, и все списки имеют одинаковую длину (5 элементов в каждом списке).

Я без проблем создаю свой файл excel, лист и заголовки файла excel:

listing = xlsxwriter.Workbook(path_report + "/Listing.xlsx")
worksheet = listing.add_worksheet("Listing")

worksheet.write(0, 0, "files_list_database")
worksheet.write(0, 1, "totals_list_database")
worksheet.write(0, 2, "files_list_csv")
worksheet.write(0, 3, "prices_list_csv")
worksheet.write(0, 4, "match")

И вот часть, где я изо всех сил пытаюсь заполнить 5 первых строк (по одной строке на элемент списков; я хотел бы, чтобы 1-й элемент каждого списка находился в первой строке, и каждый список имел свой заголовок с тем же именем, чтобы было нет путаницы):

row = 0

for files_list_database, totals_list_database, files_list_csv, prices_list_csv in files_list_database:

    worksheet.write(row + 1, 0, files_list_database[row]) 
    worksheet.write(row + 1, 1, totals_list_database[row])
    worksheet.write(row + 1, 2, files_list_csv[row])
    worksheet.write(row + 1, 3, prices_list_csv[row])

    row = row + 1

files_list_database, totals_list_database, files_list_csv и price_list_csv — мои 4 списка, каждый из которых содержит 5 элементов.

Вот сообщение об ошибке:

--> for files_list_database, totals_list_database, files_list_csv, prices_list_csv in files_list_database:
          worksheet.write(row + 1, 0, files_list_database[row])
          worksheet.write(row + 1, 1, totals_list_database[row])

ValueError: too many values to unpack (expected 4)

Я не понимаю, что означает «ValueError: слишком много значений для распаковки (ожидается 4)», компьютер должен ожидать 5 значений, так как в каждом из моих списков по 5 значений? Я предполагаю, что это происходит из базы данных «in files_list_database», которая записывается дважды в одной строке, но я не могу понять, как указать, сколько раз я хочу, чтобы компьютер перебирал списки...

Цель состоит в том, чтобы иметь возможность повторить эту процедуру, даже если списки содержат по 1000 значений каждый :) ! (Все списки всегда будут содержать одинаковое количество значений)

В основном, из этих 4 списков:

files_list_database = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
totals_list_database = [1000, 2000, 3000, 4000, 5000]
files_list_csv = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
prices_list_csv = ['1000', '2000', '3000', '4000', '50000']

Я хотел бы заполнить свой файл Excel, а затем выполнить сопоставление с простой формулой Excel :)!

Ожидаемое изображение, сгенерированное файлом Excel

Спасибо за вашу помощь :) !


person Noam Alioui    schedule 26.04.2020    source источник


Ответы (1)


Есть как минимум 2 способа записи списков в файл Excel.

Использование панд

import pandas as pd

files_list_database = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
totals_list_database = [1000, 2000, 3000, 4000, 5000]
files_list_csv = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
prices_list_csv = ['1000', '2000', '3000', '4000', '50000']

df['files_list_database'] = pd.Series(files_list_database)
df['totals_list_database'] = pd.Series(totals_list_database)
df['files_list_csv'] = pd.Series(files_list_csv)
df['prices_list_csv'] = pd.Series(prices_list_csv)

df.to_excel('test.xlsx', index=False)

Использование xlsxwriter

import xlsxwriter

files_list_database = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
totals_list_database = [1000, 2000, 3000, 4000, 5000]
files_list_csv = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
prices_list_csv = ['1000', '2000', '3000', '4000', '50000']

workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet('Sheet1')

worksheet.write('A1', 'files_list_database')
for row in range(2,len(files_list_database)+2):
    worksheet.write(f'A{row}', files_list_database[row-2])

worksheet.write('B1', 'totals_list_database')
for row in range(2,len(totals_list_database)+2):
    worksheet.write(f'B{row}', totals_list_database[row-2])

worksheet.write('C1', 'files_list_csv')
for row in range(2,len(files_list_csv)+2):
    worksheet.write(f'C{row}', files_list_csv[row-2])

worksheet.write('D1', 'prices_list_csv')
for row in range(2,len(prices_list_csv)+2):
    worksheet.write(f'D{row}', prices_list_csv[row-2])

workbook.close()

В обоих случаях вывод идентичен желаемому файлу:

введите здесь описание изображения

*РЕДАКТИРОВАТЬ*

Вы также можете создать словарь, который будет содержать все ваши имена файлов вместе с их данными:

import xlsxwriter

files_list_database = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
totals_list_database = [1000, 2000, 3000, 4000, 5000]
files_list_csv = ['2020_04_20_1.csv', '2020_04_20_2.csv', '2020_04_20_3.csv', '2020_04_20_4.csv', '2020_04_20_5.csv']
prices_list_csv = ['1000', '2000', '3000', '4000', '50000']

workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet('Sheet1')

# Create a dictionary with your file names and your files
all_files = {'files_list_database': files_list_database,
            'totals_list_database': totals_list_database,
            'files_list_csv': files_list_csv,
            'prices_list_csv': prices_list_csv}

for index, file in enumerate(all_files):
    worksheet.write(0, index, file)
    for row in range(1, len(all_files[file])+1):
        worksheet.write(row, index, all_files[file][row-1])

workbook.close()
person Dimitris Thomas    schedule 26.04.2020
comment
Метод xlsxwriter — это то, что мне было нужно! Я, тем не менее, немного удивлен, что не могу объединить 4 цикла for в один цикл for с 4 строками для выполнения; вероятно, потому что я знаю, что мог бы сделать это с помощью VBA. Спасибо - person Noam Alioui; 26.04.2020
comment
Можно, на самом деле все есть. Проверьте мой ответ, я отредактировал его, чтобы добиться желаемого результата за один цикл. - person Dimitris Thomas; 26.04.2020
comment
Это идеально. Раньше я пытался создать словарь, но это не сработало. Я попытаюсь понять, как цикл и словарь работают вместе. Спасибо за вашу помощь. - person Noam Alioui; 26.04.2020