Как правильно добавлять данные в xlsx через pandas

Рейтинг: 0Ответов: 1Опубликовано: 08.02.2023

Всем привет, кто подскажет как через pandas добавлять данные в файл не перезатерая предыдущие записи? Есть вот такой вот цикл, но в файл попадает только последний продукт

for item in product_nodes:
    name = item.find('div', class_='list-filter-result__name').text.strip()
    url_product = item.find('div', class_='list-filter-result__name').find(
        'a').get('href')
    vendor_code = item.find('a', class_='prdct-artcl').text.replace(
        'Код товара:', '').strip()
    try:
        price = item.find('span',
                          class_='list-filter-result-price__valid').text\
            .strip().replace(' ','')
        price = re.findall(r'(^\d+)', price)[0]
    except:
        price = '0'
    df_marks = pd.DataFrame({'артикул': [vendor_code],
                             'наименование': [name],
                             'price': [price],
                             'category': [category],
                             'url': [url_product]})
    writer = pd.ExcelWriter('test.xlsx')
    df_marks.to_excel(writer, index=False)

Ответы

▲ 1Принят

Примерно так можно собрать в список словарей значения:

data = []
for item in product_nodes:
    # тут ваш код для разбора данных в переменные
    ...
    data.append({'артикул': vendor_code,
                 'наименование': name,
                 'price': price,
                 'category': category,
                 'url': url_product})

# цикл кончился, делаем датафрейм
df_marks = pd.DataFrame(data)
df_marks.to_excel('test.xlsx', index=False)

Pandas одинаково нормально воспринимает и список словарей и словарь списков, можно и так и так данные собирать - и в отдельные списки, а потом из них словарь сделать, а можно как тут делать словари и собирать их в список.

P.S. А если всё-таки нужен ExcelWriter, то не забывайте использовать менеджер контекста, чтобы файл правильно закрылся:

with pd.ExcelWriter('test.xlsx') as writer:
    df_marks.to_excel(writer, index=False)