【问题标题】:Struggling to export csv data from QTableWidget [duplicate]努力从 QTableWidget 导出 csv 数据 [重复]
【发布时间】:2019-12-16 13:48:18
【问题描述】:

所以我正在尝试编写一个代码,将 csv 文件加载到每个选项卡上的 QTableWidget 中,然后可以对其进行编辑和保存。但是,当我保存时,程序由于各种原因崩溃。虽然没有设置自动加载,但我尝试一次解决一个问题!

我看到很多帖子似乎都在问同样的问题,但是在实现它们时它们似乎不起作用,有些是因为它们使用 tableview 而不是 QTableWidget,有些可能是因为我是新手,未能正确实现它编码。

类 MyTabs(QWidget):

def __init__(self, parent):
    super(QWidget, self).__init__(parent)
    layout = QVBoxLayout(self)

    # Initialize tab screen
    self.tabs = QTabWidget()
    self.tabmon = QWidget()
    self.tabtue = QWidget()

    # Add tabs
    self.tabs.addTab(self.tabmon, "Monday")
    self.tabs.addTab(self.tabtue, "Tuesday")

    #Save Button

    self.buttonSavemon = QtWidgets.QPushButton('Save', self)
    self.buttonSavemon.clicked.connect(self.handleSavemon)

    self.buttonSavetue = QtWidgets.QPushButton('Save', self)
    self.buttonSavetue.clicked.connect(self.handleSavetue)

    #Initiate Tables
    self.createTable()

    # Create Monday tab
    self.tabmon_layout = QVBoxLayout(self.tabmon)
    self.tabmon_layout.addWidget(self.tablewidgetmon)
    self.tabmon_layout.addWidget(self.buttonSavemon)

    # Create Tuesday tab
    self.tabtue_layout = QVBoxLayout(self.tabtue)
    self.tabtue_layout.addWidget(self.tablewidgettue)
    self.tabtue_layout.addWidget(self.buttonSavetue)

    # Add tabs to widget
    layout.addWidget(self.tabs)

def createTable(self):
    #Monday Table
    self.tablewidgetmon = QTableWidget()
    self.tablewidgetmon.setRowCount(10)
    self.tablewidgetmon.setColumnCount(2)
    self.tablewidgetmon.setHorizontalHeaderLabels(["Time", "File Name"])

    #Tuesday Table
    self.tablewidgettue = QTableWidget()
    self.tablewidgettue.setRowCount(12)
    self.tablewidgettue.setColumnCount(2)
    self.tablewidgettue.setHorizontalHeaderLabels(["Time", "File Name"])

def handleSavemon(self):
    with open('monschedule.csv', 'wb') as stream:
        writer = csv.writer(stream)
        for row in range(self.tablewidgetmon.rowCount()):
            rowdata = []
            for column in range(self.tablewidgetmon.columnCount()):
                item = self.tablewidgetmon.item(row, column)
                if item is not None:
                    rowdata.append(
                        unicode(item.text()).encode('utf8'))
                else:
                    rowdata.append('')
            writer.writerow(rowdata)

def handleSavetue(self):
    with open('tueschedule.csv', "w") as fileOutput:
        writer = csv.writer(fileOutput)
        for rowNumber in range(self.tablewidgettue.rowCount()):
            fields = [
                self.tablewidgettue.data(
                    self.tablewidgettue.index(rowNumber, columnNumber),
                    QtCore.Qt.DisplayRole
                )
                for columnNumber in range(self.tablewidgettue.columnCount())
            ]
            writer.writerow(fields)

我在这里尝试了两种保存方法,Monday 函数似乎最有希望,但是由于数据是字符串,所以给我一个错误。

从之后查看 csv 文件来看,它似乎已将原始文件擦除干净但未保存新数据。

【问题讨论】:

    标签: python pyqt5


    【解决方案1】:

    您正在将文件作为二进制文件而不是文本文件打开。这就是为什么writerow 函数需要一个类似字节的对象。

    要修复它,请删除 open 调用中的“b”标志:

    with open('monschedule.csv', 'w') as stream:
    

    顺便说一句,rowdata.append(unicode(item.text()).encode('utf8')) 应该是rowdata.append(item.text())

    【讨论】:

      【解决方案2】:

      试试看:

      from PyQt5 import QtCore, QtGui, QtWidgets
      from PyQt5.QtCore    import *
      from PyQt5.QtGui     import *
      from PyQt5.QtWidgets import *
      import csv
      
      
      class MyTabs(QWidget):
          def __init__(self, parent=None):
              super(QWidget, self).__init__(parent)
              layout = QVBoxLayout(self)
      
              # Initialize tab screen
              self.tabs = QTabWidget()
              self.tabmon = QWidget()
              self.tabtue = QWidget()
      
              # Add tabs
              self.tabs.addTab(self.tabmon, "Monday")
              self.tabs.addTab(self.tabtue, "Tuesday")
      
              #Save Button
      
              self.buttonSavemon = QtWidgets.QPushButton('Save', self)
              self.buttonSavemon.clicked.connect(self.handleSavemon)
      
              self.buttonSavetue = QtWidgets.QPushButton('Save', self)
              self.buttonSavetue.clicked.connect(self.handleSavetue)
      
              #Initiate Tables
              self.createTable()
      
              # Create Monday tab
              self.tabmon_layout = QVBoxLayout(self.tabmon)
              self.tabmon_layout.addWidget(self.tablewidgetmon)
              self.tabmon_layout.addWidget(self.buttonSavemon)
      
              # Create Tuesday tab
              self.tabtue_layout = QVBoxLayout(self.tabtue)
              self.tabtue_layout.addWidget(self.tablewidgettue)
              self.tabtue_layout.addWidget(self.buttonSavetue)
      
              # Add tabs to widget
              layout.addWidget(self.tabs)
      
          def createTable(self):
              #Monday Table
              self.tablewidgetmon = QTableWidget()
              self.tablewidgetmon.setRowCount(10)
              self.tablewidgetmon.setColumnCount(2)
              self.tablewidgetmon.setHorizontalHeaderLabels(["Time", "File Name"])
      
              #Tuesday Table
              self.tablewidgettue = QTableWidget()
              self.tablewidgettue.setRowCount(12)
              self.tablewidgettue.setColumnCount(2)
              self.tablewidgettue.setHorizontalHeaderLabels(["Time", "File Name"])
      
      
          def handleSavemon(self):
      #        with open('monschedule.csv', 'wb') as stream:
              with open('monschedule.csv', 'w') as stream:                  # 'w'
                  writer = csv.writer(stream, lineterminator='\n')          # + , lineterminator='\n'
                  for row in range(self.tablewidgetmon.rowCount()):
                      rowdata = []
                      for column in range(self.tablewidgetmon.columnCount()):
                          item = self.tablewidgetmon.item(row, column)
                          if item is not None:
      #                        rowdata.append(unicode(item.text()).encode('utf8'))
                              rowdata.append(item.text())                   # +
                          else:
                              rowdata.append('')
      
                      writer.writerow(rowdata)
      
      
          def handleSavetue(self):
              with open('tueschedule.csv', "w") as fileOutput:
                  writer = csv.writer(fileOutput)
                  for rowNumber in range(self.tablewidgettue.rowCount()):
      # +                
                      fields = [
                          self.tablewidgettue.item(rowNumber, columnNumber).text() \
                                  if self.tablewidgettue.item(rowNumber, columnNumber) is not None else ""
                          for columnNumber in range(self.tablewidgetmon.columnCount())
                      ]                
      
                      writer.writerow(fields)
      
      
      if __name__ == "__main__":
          import sys
          app = QtWidgets.QApplication(sys.argv)
          main = MyTabs()
          main.show()
          sys.exit(app.exec_()) 
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多