Писать в Excel - Python - PullRequest
       5

Писать в Excel - Python

0 голосов
/ 31 августа 2018

Я новичок и буду признателен за помощь в написании моего кода. Я написал эту функцию:

    def write_captions_to_excel_file(self, filenames, titles, indexs, description_path):
        print('writing to excel')
        workbook = Workbook(os.path.join(description_path, 'all_captions.xlsx'))
        worksheet = workbook.add_worksheet()
        firstrow = 0
        worksheet.write(firstrow, 0, 'Image name')  # 3 --> row number, column number, value
        worksheet.write(firstrow, 1, 'Titles')
        worksheet.write(firstrow, 2, 'Description')
        row = indexs + 1
        worksheet.write(row, 0, filenames)
        origin_title = titles.h1.getText()
        worksheet.write(row, 1, origin_title.capitalize())
        print(origin_title.capitalize())
        worksheet.write(row, 2, '')
        sleep(3)
        workbook.close()

Проблема в том, что я вызываю эту функцию много раз, в первый раз я получаю результат в строках 0 и 1, затем при повторном запуске это дает мне результаты в строках 0 и 2, строки 1, результаты в строке были стерты. То же самое в звонках других.

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

Как я вижу в документации, XlsxWriter предназначен только для записи файлов. Он не может прочитать или изменить существующий файл Excel.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Отлично, я использую списки вместо вызова функции несколько раз, и теперь она работает хорошо. Я сделал это: def download_portal(self): for index, link in enumerate(all_links): self.list1.append(filename) self.list2.append(origin_title.capitalize()) self.list3.append(spec_date.split("world ", 1)[1]) descriptions_folder_path = os.path.join(self.path, 'description') if not os.path.exists(descriptions_folder_path): os.mkdir(descriptions_folder_path) self.write_captions_to_excel_file(descriptions_folder_path, self.list1, self.list2, self.list3 )

    def write_captions_to_excel_file(self,description_path, firstlists, secondlists, thirdlists):
    print('writing to excel')
    workbook = Workbook(os.path.join(description_path, 'all_captions.xlsx'))
    worksheet = workbook.add_worksheet()
    row = 0
    worksheet.write(row, 0, 'Image name')  # 3 --> row number, column number, value
    worksheet.write(row, 1, 'Titles')
    worksheet.write(row, 2, 'Dates')
    row += 1
    for index, firstlist in enumerate(firstlists):
        worksheet.write(row, 0, firstlist)
        print(firstlist)
        row += 1
    row = 1
    for secondlist in secondlists:
        worksheet.write(row, 1, secondlist)
        print(secondlist)
        row += 1
    row = 1
    for thirdlist in thirdlists:
        worksheet.write(row, 2, thirdlist)
        print(thirdlist)
        row += 1
    sleep(3)
    workbook.close()

Я тоже пытаюсь использовать кортеж, а затем сохранить в 3 списках, а затем с одним циклом for записать данные в excel, но я получаю ошибку, и теперь я использую этот способ. Будет лучше написать в столбце Excel для каждого столбца, но я тоже справился с этой задачей.

Спасибо

0 голосов
/ 01 сентября 2018

Добро пожаловать на ТАК!

Вы правы. Вы не можете добавлять данные с помощью xlsx writer. Но вы можете изменить свой код, чтобы сделать то, для чего вы предназначены.

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

Пример кода будет как,

import os
import xlsxwriter

def write_captions_to_excel_file(data_list, description_path, headers):
    workbook = xlsxwriter.Workbook(os.path.join(description_path, 'all_captions.xlsx'))
    worksheet = workbook.add_worksheet()
    for row, data in enumerate(data_list):
        for col, header in enumerate(headers):
            if header == 'Titles':
                text_to_write = data[header]
            else:
                text_to_write = data[header].h1.getText().capitalize()
            worksheet.write(row+1, col, text_to_write)


def some_function():
    headers = ['Image name', 'Titles', 'Description']
    description_path = 'some/path/to/file'
    filenames = ['x', 'y', 'z']
    titles = ['z', 'y', 'x']
    data_list = []
    for i, j in enumerate(filenames):
        combined_dict = dict()
        combined_dict['Image name'] = j
        combined_dict['Titles'] = titles[i]
        data_list.append(combined_dict)
    write_captions_to_excel_file(data_list, description_path, headers)

надеюсь, это поможет! Не стесняйтесь комментировать любые уточнения.

Ура!

...