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-те първи реда (по един ред на елемент от списъците; бих искал първият елемент от всеки списък да е в първия ред и всеки списък да има заглавка със същото име, така че там няма объркване):

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 и prices_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