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

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

19.10.2024, 14:31. Показов 4899. Ответов 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
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
30.10.2024, 07:11
Студворк — интернет-сервис помощи студентам
greker1,
Python
1
2
3
4
5
6
7
8
import pandas as pd 
 
lst = ['mark 10 12-10-2015', 'also 7 10-10-2014', 'take 2 01-05-2015']
 
df = pd.DataFrame({'x':lst})
df['first_num'] = df.x.str.extract('(\d+)')
df['all_num'] = df['x'].str.findall('(\d+)')
print(df)
1
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
30.10.2024, 13:58  [ТС]
Gdez, has no attribute 'x'
У меня в df - данные из таблицы excel, на что мне его заменить? Столбец, в котором надо оставить только числа?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
30.10.2024, 14:00
greker1, В данном случае - имя столбца, из которого «вытаскиваемые» числа

Добавлено через 54 секунды
Ниже - «классическая» форма записи
1
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
30.10.2024, 18:37  [ТС]
Gdez, понял)
Получилось, спасибо ща помощь!)))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
01.11.2024, 19:27  [ТС]
Ещё вопрос возник:
Как прописать код, чтобы при отсутствии какого-либо файла для подгрузки в df выдавалось сообщение типа "такой-то файл отсутствует", и сам код выполнялся дальше? Просто каких-то данных может не быть, но это не критично для самой обработки
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
01.11.2024, 19:55
greker1, можно через try … except …
1
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
01.11.2024, 22:44  [ТС]
Gdez, Попробую, спасибо за совет))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
02.11.2024, 14:00  [ТС]
Gdez, Извиняюсь за кучку дурацких и простых вопросов, но спасибо огромное за оказанную уже помощь и прошу ещё помочь))
В df есть столбец с датой и временем вида: 01-11-2024 10:00:00+03:00.
Как его разбить в два новых столбца: первый с датой 01-11-2024, второй со временем 10:00:00 ?)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
02.11.2024, 14:06
greker1,
Python
1
2
3
4
…
df["Date"] = df["datetime"].dt.date
df["Time"] = df["datetime"].dt.time
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
05.11.2024, 13:29  [ТС]
Спасибо, получилось)
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
19.11.2024, 13:01  [ТС]
Добрый день, ещё вопрос возник)
Есть dataframe с 4-мя столбцами: Блок, отдел, сотрудник, сумма
Как можно добавить данные в df с условием
- если отдел = "Первый" и отдел начинается с "Бухг", то эти строки добавляются в конец df с отделом "Первый один", остальные данные в строке без изменений?
Спасибо))
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
19.11.2024, 13:06
greker1, нужно хоть небольшой пример входных данных, и что должно получиться
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
19.11.2024, 23:01  [ТС]
Gdez, вложил файл, лист "Лист1".
Вспомнил доп ещё(((
Сейчас попробую написать ещё раз:
Если блок = "Первый" и отдел начинается с "Бухг", то эти строки добавляются в конец df с блоком "Первый один"
Если блок = "Первый" и отдел начинается с "Аво", то эти строки тоже добавляются в конец df с блоком "Первый два"

Извиняюсь, писал с телефона, сам не разглядел путаницы с блоками и отделами(((
Вложения
Тип файла: xlsx Таблицы.xlsx (19.1 Кб, 2 просмотров)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
20.11.2024, 09:34
greker1,
Python
1
2
3
4
5
6
7
8
9
…
que = (df['Блок'].values == 'Первый') & (df['Отдел'].str.startswith(('Бухг', 'Аво')))
df1 = df[que]
df1.loc[:,'Блок'] += np.where(df1['Отдел'].str.startswith('Бухг'), ' один',
                      np.where(df1['Отдел'].str.startswith('Аво'), ' два', ''))
 
df = df._append(df1)
df.reset_index(drop=True, inplace=True)
df
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
20.11.2024, 12:52  [ТС]
SyntaxError: invalid syntax на строке df1 = df[que]

Это поправил, скобку пропустил (((



Добавлено через 1 минуту
А если оставить для "Бухг" Первый один, а для остальных Первый два? Не только "Аво", а всех остальных

Добавлено через 13 минут
Отрабатывает без ошибок, но просто повторил все данные с блоком ещё раз, без каких-либо изменений
1
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
20.11.2024, 13:12
greker1,
А если оставить для "Бухг" Первый один, а для остальных Первый два? Не только "Аво", а всех остальных
Python
1
2
…
df1.loc[:,'Блок'] += np.where(df1['Отдел'].str.startswith('Бухг'), ' один', ' два')
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
20.11.2024, 16:04  [ТС]
Получилось, спасибо за помощь!)))Gdez,
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
26.11.2024, 23:49  [ТС]
Добрый вечер)
Прошу ещё помощи в двух проблемках((
Таблицу вложил:
-лист данные - пример того, что есть. Может быть несколько тысяч строк, номер может быть один и тот же хоть у десятка строк, статусов больше 30-и.
-лист результат1 - что должно получиться по первому вопросу.
-лист результат2 - что должно получиться по второму вопросу.

Собственно, вопросы...
1. надо проверить "плюс" и статусы: "начислено", "выплачено", "добыто" на предмет кратности: то есть, выделить те строки, где сумма поделить на номинал не кратна 100, и выделить их в отдельный dataframe
2. надо из данных сделать выборку, чтобы получить список, где отдел, плюс/минус, тип и обе даты совпадают, но строки со статусами "не начислено" и "незаслуженно" имеют более раннее время, чем строки со статусами "начислено", "выплачено" или "добыто".

Спасибо)))
Вложения
Тип файла: xlsx Таблицыы.xlsx (14.8 Кб, 5 просмотров)
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 07:08  [ТС]
Про даты второго вопроса: даты совпадают по строкам, но в одной строке они могут быть разными
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
27.11.2024, 08:37
greker1, Второй вопрос могут быть проблемы
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd
import numpy as np
 
df = pd.read_excel('/content/drive/MyDrive/Таблицыы.xlsx', sheet_name=0)
df
 
df1 = df[(df['Плюс/минус'] == 'плюс') & (df['Сумма']%(df['Номинал']*100)>0)]
df1
 
cols = ['Отдел', 'Плюс/минус', 'Дата1', 'Дата2']
#убрал столбец "Тип", иначе получится пустой фрейм - нет совпадений в примере
#если он необходим, то добавить в список
 
df_tmp = df[df[cols].duplicated(keep=False)].sort_values(['Номер','Время']).reset_index(drop=True)
df_tmp['tmp'] = df_tmp['Статус'].str.startswith('не')
df_tmp.drop_duplicates(cols+['tmp'], inplace=True)
 
ind = (df_tmp['tmp'] > df_tmp['tmp'].shift(-1)) & (df_tmp['Отдел'] == df_tmp['Отдел'].shift(-1))
lst = df_tmp.loc[ind, 'Номер']
 
df2 = df_tmp.loc[df_tmp['Номер'].isin(lst), df_tmp.columns[:-1]]
df2
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2024, 08:37

Переименование таблицы в базе данных (или добавление таблиц в базу данных с именами таблиц из переменной)
С помощью панды из двоичного файла получил таблицу типа 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,но не могу разобраться с подключениями,может ли кто подсказать...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru