Экспорт данных QTABLEWIDGET (столбцы, строки, все, ...) в SQLITE3

Экспорт данных QTableWidgets, заполненных пользователем, в файл db. (файл db не существует, поэтому SQLITE3 создаст его в указанном каталоге.)

Вот код, который я использовал:

    self.CreateDatasetButton.connect(self.createDS)

def CreateDS(self):
    self.proceed = QtWidgets.QMessageBox.question(
        self, 
        'Information', 
        'Have you Verified your Data?',
        QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
    if self.proceed == QtWidgets.QMessageBox.Yes:
        self.showDialog()
    else:
        pass

def showDialog(self):
    self.text, ok = QtWidgets.QInputDialog.getText(self, 'Almost Done !', 
        '\n\nname your file :')
    if ok:
        self.Createdb()

def Createdb(self):
    conn = sqlite3.connect('__Datasets__/%s.db' %(self.text))
    # problema here
    conn.close()
    self.app_statusbar.showMessage('%s is created' %(self.text()))

Экспорт данных QTABLEWIDGET (столбцы, строки, все, ...) в SQLITE3

заменить ok, self.text = QtWidgets.QInputDialog.getText(self, 'Almost Done !', '\n\nname your file :') на self.text, ok = QtWidgets.QInputDialog.getText(self, 'Almost Done !', '\n\nname your file :')

S. Nick 28.10.2018 21:24

это сработало, 1 проблема не работает. Спасибо !

user10567350 28.10.2018 22:08

everything == вся информация внутри QTableWidget. (заголовки, элементы, ...)

user10567350 28.10.2018 22:59

та же логика, что и у pandas, где заголовки - это ключи, а элементы - это, например, значения. example_dict = {"название заголовка": [item1, item2, item3, ....],}

user10567350 28.10.2018 23:06

Я знаю, что у меня проблемы со связью, так что терпи меня, пожалуйста

user10567350 28.10.2018 23:07

@eyllanesc отметил.

user10567350 28.10.2018 23:37

@eyllanesc, пожалуйста, объясните мне этот код?

user10567350 29.10.2018 00:09

@ user10567350, пожалуйста, если вы спросите о моем решении, сделайте это в разделе под моим ответом, как было, и я не знаю, почему вы его удалили.

eyllanesc 29.10.2018 00:12

@eyllanesc я не мог отметить тебя

user10567350 29.10.2018 00:15

@ user10567350 тег используется, когда есть более двух разных пользователей, здесь 3 пользователя: вы, С.Ник и я, так что если вы напишете, кто уведомит? не известно, что с помощью тега можно различать, это тот случай, когда мы 2 в этом нет необходимости.

eyllanesc 29.10.2018 00:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
253
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя pandas, задача проста, решение состоит в том, чтобы преобразовать QTableWidget в фрейм данных, а затем экспортировать его:

import sqlite3
import pandas as pd
from PyQt5 import QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.table_widget = QtWidgets.QTableWidget()
        self.create_data()
        button = QtWidgets.QPushButton("Export")
        button.clicked.connect(self.on_clicked)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.table_widget)
        lay.addWidget(button)

    def create_data(self):
        self.table_widget.setColumnCount(4)
        self.table_widget.setRowCount(10)
        self.table_widget.setHorizontalHeaderLabels(["A", "B", "C", "D"])

        import random
        for i in range(self.table_widget.rowCount()):
            for j in range(self.table_widget.columnCount()):
                it = QtWidgets.QTableWidgetItem(str(random.randint(0, 100)))
                self.table_widget.setItem(i, j, it)

    def on_clicked(self):
        proceed = QtWidgets.QMessageBox.question(self, 
            'Information', 
            'Have you Verified your Data?',
            QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
        if proceed != QtWidgets.QMessageBox.Yes:
            return

        filename, ok = QtWidgets.QInputDialog.getText(self, 'Almost Done !', 'name your file :')
        if ok:
            self.saveToDb(filename, "table_name")

    def saveToDb(self, db_filename, tablename):
        d = {}
        for i in range(self.table_widget.columnCount()):
            l = []
            for j in range(self.table_widget.rowCount()):
                it = self.table_widget.item(j, i)
                l.append(it.text() if it is not None else "")
            h_item = self.table_widget.horizontalHeaderItem(i)
            n_column = str(i) if h_item is None else h_item.text()
            d[n_column] = l

        df = pd.DataFrame(data=d)
        engine = sqlite3.connect(db_filename)
        df.to_sql(tablename, con=engine)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

@ user10567350 Было бы хорошо проанализировать решение, и если вы не понимаете, вы можете спросить меня о конкретной проблеме, в следующем комментарии я постараюсь объяснить ее в общих чертах.

eyllanesc 29.10.2018 00:10

@ user10567350 Стратегия состоит в том, чтобы получить словарь списков, где ключ - это имя столбца, а список имеет значения, связанные с элементами в каждом столбце. Чтобы получить QTableWidgetItem, я использовал элемент, но в общем случае элементы могут быть нулевыми, поэтому я проверяю, если это так, я сохраняю пустую строку, если это не так, я сохраняю текст. После создания словаря списка создается фрейм данных и экспортируется в sqlite (эти 2 шага, я думаю, вы должны это знать, поскольку вы упомянули панды)

eyllanesc 29.10.2018 00:16

@ user10567350 Есть еще вопросы? Если мой ответ вам поможет, не забудьте отметить его как правильный, если вы не знаете, как это сделать, просмотрите тур, это лучший способ поблагодарить.

eyllanesc 29.10.2018 00:20

Да, у меня вопрос. Почему возврат QinputDialog пуст?

user10567350 29.10.2018 00:27

@ user10567350 Почему вы говорите, что QinputDialog пуст?

eyllanesc 29.10.2018 00:29

нет, извините, я говорю о QMessageBox || если продолжить! = QtWidgets.QMessageBox.Yes: return || (ваше кодирование продвинуто для моего уровня) и почему! =, а не ==?

user10567350 29.10.2018 00:33

@ user10567350 Если пользователь указывает, что он не хочет что-то делать, чтобы он продолжал что-то делать, лучше оставить функцию с помощью return, не так ли? Таким образом, мы избегаем множества вложений, если у вас более читаемый код, если вы не хотите что-то делать, когда пользователь говорит «нет». Не забудьте отметить мой ответ как правильный.

eyllanesc 29.10.2018 00:37

да, ваша точка зрения верна, я только что попробовал ваш код, и он создает файл, но без расширения, это нормально?

user10567350 29.10.2018 00:41

@ user10567350 в диалоговом окне необходимо разместить расширение, например mydb.db. Ты сделал это?

eyllanesc 29.10.2018 00:57

Я начинаю понимать ваш код, в чем польза: 1) - «table_name» в self.savetodb (filename, «table_name») ||| 2) - имя таблицы в def savetodb (self, db_filename, tablename) |||

user10567350 29.10.2018 01:05

@ user10567350 Знаете ли вы что-нибудь о пандах? Я предполагаю, что, поскольку вы комментировали, вы должны знать, как использовать to_sql (), для которого требуется имя таблицы, и просто «table_name» - это имя таблицы, которую вы используете по умолчанию.

eyllanesc 29.10.2018 01:08

я еще не дошел до этого момента, но спасибо, что сообщили мне: D, в любом случае ваш код идеален, и спасибо за вашу помощь

user10567350 29.10.2018 01:17

Другие вопросы по теме