Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70

Добавление данных из таблицы xlsx в базу .db с форматированием

19.10.2024, 14:31. Показов 4887. Ответов 59

Добрый день.
Пытаюсь добавить данные для их обработки из нескольких файлов xlsx в одну созданную базу baza.db с помощью питона версии 3.9.7 (пакет Anaconda + jupyter notebook).

Есть код, создающий две таблицы:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sqlite3
import pyodbc
import pandas as pd
from datetime import datetime, timedelta, date
import time
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
import csv
with sqlite3.connect(r'путь \baza.db') as conn:
    cursor = conn.cursor()
    # Открытие файла Excel и чтение данных
    df1 = pd.read_excel(r'путь айл1.xlsx', sheet_name='Лист1', usecols="A:J", nrows=4)
    df2 = pd.read_excel(r'путь айл1.xlsx', sheet_name='Лист2', usecols="A,C:I,K:Q,U:V", nrows=6, skiprows=1)
    for index, row in df1.iterrows():
        values_list = [row[column] for column in df1.columns]
        insert_query = """
        INSERT INTO Table1 (Ст1, Ст2, Ст3, Ст4, Ст5, Ст6, Ст7, Ст8, Ст9, Ст10)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
        """
        cursor.execute(insert_query, values_list)
    conn.commit()
    for index, row in df2.iterrows():
        values_list = [row[column] for column in df2.columns]
        insert_query = """
        INSERT INTO Table2 (Ст1, Ст2, Ст3, Ст4, Ст5, Ст6, Ст7, Ст8, Ст9, Ст10, Ст11, Ст12, Ст13, Ст14, Ст15, Ст16, Ст17)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
        """
        cursor.execute(insert_query, values_list)
    conn.commit()
cursor.close()
conn.close()
print("Данные подгружены"+time.ctime())
Есть две проблемы:
1) В столбце A с листа 2 (df2) надо добавить кавычки в каждую ячейку столбца: сейчас там все значения в формате ‘АБВ Вапваупауи’, а нужен вид ‘АБВ “Вапваупауи”’. Значения текстовые, разная длина.
2) Надо запихнуть данные с обоих листов файла в одну таблицу (а не две), по сути сложенную из обеих (к Table1 подтянуть значения Table2 (столбцы: Ст2, Ст3, Ст4, Ст5, Ст6, Ст7, Ст8, Ст9, Ст10, Ст11, Ст12, Ст13, Ст14, Ст15, Ст16, Ст17), на обоих листах файла excel текстовые значения в столбцах A совпадают (спасибо кавычкам), но могут быть расположены в разном порядке.

Подскажите, как допилить, пожалуйста)))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2024, 14:31
Ответы с готовыми решениями:

Добавление таблицы в базу данных
Как добавить таблицу в базу данных? Если нету ссылки добавление таблицы в базу данных SQL. Качал и устанавливал SQL Server Data Tools...

Добавление данных в базу и обновление таблицы на странице
Здравствуйте! Пишу сайт (я новичок), использую Python + Django + HTML + CSS + Bootstrap + JS + JQuery. Задача: хочу вызвать модальное...

Программное добавление таблицы в другую базу данных
Добрый день. Прошу сильно не пинать, я предварительно искал ответ - не нашел, видел только одну подобную тему и в ней не было ответов....

59
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 13:24  [ТС]
Gdez, вопрос очень геморный, да?((
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,319
27.11.2024, 15:22
greker1, Как и любой анализ данных по нестандартным запросам (условиям)
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 18:36  [ТС]
Gdez, возникла мысль: а если сначала сделать два списка по статусам, а потом уже сравнивать время при совпадении других данных?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,319
27.11.2024, 19:16
greker1, вот эта строчка «делает» два списка (True, False) по статусам:
Python
1
df_tmp['tmp'] = df_tmp['Статус'].str.startswith('не')
Вот эта сравнивает время:
Python
1
ind = (df_tmp['tmp'] > df_tmp['tmp'].shift(-1)) & (df_tmp['Отдел'] == df_tmp['Отдел'].shift(-1))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 23:10  [ТС]
Gdez, Спасибо, завтра попробую))

По первой задаче: получилось, спасибо!)))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
29.11.2024, 23:14  [ТС]
Gdez, По второй тоже получилось, спасибо огромнейшее за помощь!)))

Попробовал по-другому: через merge сцепил нужные столбцы с обоих dataframe, а там уже отфильтровал по условию времени.

Главное, что получилось!!!
1
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
30.11.2024, 19:17  [ТС]
Добрый вечер)
Вопрос вылез(((
Пытаюсь несколько dataframe выгрузить в один файл xlsx на разные листы. Всё выгружается , но все числа в них без разрядов. При это excel их воспринимает именно как числа, тут всё в порядке. Пытаюсь привести к виду "ххх ххх ххх" и "ххх ххх ххх.хх", либо ошибки вроде со строками не работает, либо приводит внешне в нужный вид, но уже как строки(((
Не подскажете, как правильно выгрузить числа с форматом?
Спасибо!)))
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,319
30.11.2024, 20:17
greker1, «Напрямую» не получится
Можно с помощью xlsxwriter
https://xlsxwriter.readthedocs... andas.html
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
30.11.2024, 22:26  [ТС]
Gdez, сейчас у меня код выгрузки такой:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
workbook = openpyxl.workbook()
workbook.save('name.xlsx')
with pd.ExcelWriter('name.xlsx', engine='openpyxl', mode='a') as writer:
    df1.to_excel(writer, sheet_name='Лист1', index=False)
    df2.to_excel(writer, sheet_name='Лист2', index=False)
    df3.to_excel(writer, sheet_name='Лист3', index=False)
    df4.to_excel(writer, sheet_name='Лист4', index=False)
    df5.to_excel(writer, sheet_name='Лист5', index=False)
    df6.to_excel(writer, sheet_name='Лист6', index=False)
    df7.to_excel(writer, sheet_name='Лист7', index=False)
    df8.to_excel(writer, sheet_name='Лист8', index=False)
workbook = openpyxl.load_workbook('name.xlsx')
workbook.remove(workbook['Sheet']   # удаление лишнего листа, который создаётся при создании пустого файла
Дальше преобразование ширины столбцов через цикл for по листам файла, фиксация первых строк с "шапками" и фильтры для удобства работой.

Можешь подсказать, как переделать с xlsxwriter?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,319
01.12.2024, 06:36
greker1,
Можешь подсказать, как переделать с xlsxwriter?
Нет, с форматированием через xlsxwriter и openpyxl не работал
0
115 / 100 / 15
Регистрация: 24.07.2019
Сообщений: 320
01.12.2024, 09:29
цикл по ячейкам и
Python
1
cell.number_format = '0.00' # '@', 'dd.mm.yyyy', '0.00', '0', '# ##0', 'General'
а вообще есть ведь хорошая документация
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
01.12.2024, 13:48  [ТС]
nilske, Ещё бы понимать, где что искать(( А так да, документация штука хорошая, согласен)

Цитата Сообщение от nilske Посмотреть сообщение
цикл по ячейкам и
PythonВыделить код
1
cell.number_format = '0.00' # '@', 'dd.mm.yyyy', '0.00', '0', '# ##0', 'General'
А можно конкретный пример, пожалуйста?))
0
115 / 100 / 15
Регистрация: 24.07.2019
Сообщений: 320
01.12.2024, 19:45
https://openpyxl.readthedocs.i... er-formats
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
03.12.2024, 22:11  [ТС]
Получилось в итоге так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from openpyxl import load_workbook
 
# Загрузка рабочей книги Excel
wb = load_workbook(filename="файл.xlsx")
 
# Перебор всех листов в книге
for ws in wb.worksheets:
    # Перебор всех строк на текущем листе
    for row in ws.iter_rows():
        # Перебор всех ячеек в текущей строке
        for cell in row:
            # Преобразуем значение ячейки в число, если возможно
            try:
                value = float(cell.value)
            except (ValueError, TypeError):
                continue  # Пропускаем ячейку, если не удается преобразовать значение в число
            
            # Проверяем значение ячейки
            if value < 1:
                cell.number_format = '### ### ##0.00'
            else:
                cell.number_format = '### ### ###'
 
# Сохранение изменений в той же книге
wb.save('файл.xlsx')
Спасибо за помощь)
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
04.12.2024, 22:58  [ТС]
Добрый вечер, возник вопрос((

Есть таблица excel с данными (файл вложен, лист "Что есть").

Подскажите, пожалуйста, как с помощью python сделать сортировку по нескольким столбцам сразу:
Отдел, Сотрудник и Должность - от А до Я (текстовые поля), Зп - по возрастанию (числовое поле).
Пример результата - на листе "Что должно получиться".

В самой "задачке" в файле 7 листов, данные разные, надо сделать такие сортировки на всех листах, но по разным столбцам((

Спасибо!)))
Вложения
Тип файла: xlsx Сортировочная.xlsx (24.5 Кб, 2 просмотров)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,319
05.12.2024, 06:18
greker1, https://docs-python.ru/package... ort-index/
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
05.12.2024, 13:31  [ТС]
Gdez, получилось, спасибо)))
Пришлось поискать место в коде, куда именно сортировку воткнуть, чтобы сработало.

Спасибо за помощь)))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
08.12.2024, 13:53  [ТС]
Здравствуйте))

Ещё один вопрос появился: есть два dataframe (вложенный файл, Заказ и Остаток), как из них получить dataframe вида Итого? Оба dataframe собраны в базе baza.db. Данных может быть несколько сотен строк, какие-то значения могут отсутствовать в Заказе и Остатке (как пример позиция строки №9 в Заказе и Итого, выделил курсивом)

Как их правильно объединить, чтобы были показаны данные из обоих dataframe?

Спасибо!)))
Вложения
Тип файла: xlsx Сборка.xlsx (12.5 Кб, 6 просмотров)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,319
08.12.2024, 18:56
greker1,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
import numpy as np
 
df1 = pd.read_excel('/content/drive/MyDrive/Сборка.xlsx', sheet_name=0, skiprows=1, usecols="A,B,C,D")
df2 = pd.read_excel('/content/drive/MyDrive/Сборка.xlsx', sheet_name=0, skiprows=1, usecols="F,G,H,I")
df2.columns = df1.columns.tolist()[:3] + [df2.columns.to_list()[-1]]
 
 
df_res = pd.merge(df1, df2, on=['Товар', 'Изд-во', 'Кол-во'], how='outer') #Само объединение
df_res.dropna(subset='Товар', inplace=True)
df_res.fillna(0, inplace=True)
df_res['Остаток  - сумма заказа'] = df_res['Остаток'] - df_res['Сумма заказа']
df_res = df_res.convert_dtypes()
df_res
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
15.12.2024, 22:43  [ТС]
Gdez, Извиняюсь за долгий ответ: пришлось заковыряться с проверкой дат, в результате треть скрипта переделывал(((
Со сборкой в итоге получилось так: к Остатку подтянул совпадения из Заказа, потом в отдельный dataframe выгрузил Заказы, которых нет в остатке (а вдруг такие появятся?), потом объединил их в один и к получившемуся уже притянул столбец Остаток из Остатка, заменив пустые значения на 0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.12.2024, 22:43

Переименование таблицы в базе данных (или добавление таблиц в базу данных с именами таблиц из переменной)
С помощью панды из двоичного файла получил таблицу типа DataFrame import pandas as pd df =...

Laravel 5: импорт данных из excel(xlsx) в базу
Всем доброго времени суток! Изучаю замечательный фреймворк Laravel относительно недавно (пару месяцев). Из достижений пока только блог,...

Скрипт конвертации CSV в XLSX с форматированием
Добрый день! Не много соображаю в VB.Net, но задача именно в формате отдельно исполняемого файла VBS. Задача: есть файл csv с...

Как автоматизировать импорт данных в базу mysql из xlsx файла?
Есть обновляемый файл xlsx на ftp сервере.Необходимо по расписанию импортировать его в базу mysql. подскажите как это сделать эффективно и...

Добавление записей из базу данных Access в базу данных SQL
Здравствуйте,пытаюсь добавить записи из базы данных Access в базу данных SQL,но не могу разобраться с подключениями,может ли кто подсказать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru