tsv_editor.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. '''
  2. @author: olivier.massot
  3. '''
  4. import csv
  5. import sys
  6. from PyQt5 import uic
  7. from PyQt5.Qt import QMainWindow, QApplication, QMessageBox, QStandardItemModel, \
  8. QStandardItem, Qt, QFileDialog
  9. from path import Path
  10. Ui_window, _ = uic.loadUiType(Path(__file__).parent / 'tsv_editor.ui')
  11. csv.register_dialect('tsv', delimiter='\t', quotechar='', quoting=csv.QUOTE_NONE)
  12. def exec_(filename=''):
  13. app = QApplication(sys.argv)
  14. SYS_HOOK = sys.excepthook
  15. def error_handler(typ, value, trace):
  16. while QApplication.overrideCursor():
  17. QApplication.restoreOverrideCursor()
  18. QMessageBox.critical(iface, typ.__name__, "{}".format(value))
  19. SYS_HOOK(typ, value, trace)
  20. sys.excepthook = error_handler
  21. if not filename:
  22. filename, _ = QFileDialog.getOpenFileName(None, "Selectionner un fichier TSV", ".", "Tsv Files (*.tsv *.csv)")
  23. iface = MainWindow(filename)
  24. iface.show()
  25. r = app.exec_()
  26. return r
  27. class MainWindow(QMainWindow):
  28. def __init__(self, csvpath):
  29. super (MainWindow, self).__init__()
  30. self.csvpath = csvpath
  31. self.createWidgets()
  32. def createWidgets(self):
  33. self.ui = Ui_window()
  34. self.ui.setupUi(self)
  35. self.ui.btn_cancel.clicked.connect(self.cancel)
  36. self.ui.btn_ok.clicked.connect(self.ok)
  37. self.model = QStandardItemModel(self)
  38. self.ui.tbl_data.setModel(self.model)
  39. self.ui.lbl_path.setText(self.csvpath)
  40. with open(self.csvpath, newline='') as csvfile:
  41. reader = csv.reader(csvfile, 'tsv')
  42. self.headers = next(reader)
  43. self.model.setHorizontalHeaderLabels(self.headers)
  44. for row in reader:
  45. items = [ QStandardItem(field) for field in row ]
  46. self.model.appendRow(items)
  47. def ok(self):
  48. with open(self.csvpath, "w", newline='') as fileOutput:
  49. writer = csv.writer(fileOutput, "tsv")
  50. writer.writerow(self.headers)
  51. for rowNumber in range(self.model.rowCount()):
  52. fields = [self.model.data(self.model.index(rowNumber, columnNumber), Qt.DisplayRole)
  53. for columnNumber in range(self.model.columnCount())]
  54. writer.writerow(fields)
  55. self.close()
  56. def cancel(self):
  57. self.close()
  58. if __name__ == '__main__':
  59. exec_()