[파이썬] wxPython CSV 및 Excel과의 연동

wxPython은 파이썬에서 GUI(그래픽 사용자 인터페이스) 애플리케이션을 개발하기 위해 사용되는 라이브러리입니다. 이 강력한 도구는 사용자가 직접적으로 제어할 수 있는 다양한 위젯과 이벤트 처리 기능을 제공하여 사용자 친화적인 애플리케이션을 만들 수 있게 해줍니다.

이 글에서는 wxPython을 사용하여 CSV(Comma-Separated Values) 파일 및 Excel 파일과의 연동에 대해 살펴보겠습니다. CSV 파일은 데이터를 쉼표로 구분하여 저장하는 텍스트 파일 형식이며, Excel 파일은 마이크로소프트 엑셀에서 사용되는 스프레드시트 파일입니다.

CSV 파일 읽기

CSV 파일의 데이터를 읽어와서 wxPython 애플리케이션에 표시하는 방법을 알아보겠습니다. 아래 예제는 wxPython에서 파일 대화상자를 사용하여 사용자로부터 CSV 파일을 선택하고, 선택된 파일을 읽어와서 그리드(표)에 표시하는 간단한 코드입니다.

import wx
import csv

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title)

        self.panel = wx.Panel(self)
        self.grid = wx.grid.Grid(self.panel)

        self.button = wx.Button(self.panel, label="Open CSV")
        self.button.Bind(wx.EVT_BUTTON, self.open_csv)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.grid, 1, wx.EXPAND)
        sizer.Add(self.button, 0, wx.ALIGN_RIGHT)

        self.panel.SetSizer(sizer)

    def open_csv(self, event):
        wildcard = "CSV files (*.csv)|*.csv"
        dialog = wx.FileDialog(self, "Open CSV file", wildcard=wildcard,
                               style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)

        if dialog.ShowModal() == wx.ID_CANCEL:
            return

        filepath = dialog.GetPath()
        self.read_csv(filepath)

    def read_csv(self, filepath):
        with open(filepath, "r") as file:
            reader = csv.reader(file)
            data = [row for row in reader]

        self.grid.CreateGrid(len(data), len(data[0]))
        for row_num, row_data in enumerate(data):
            for col_num, value in enumerate(row_data):
                self.grid.SetCellValue(row_num, col_num, value)

        self.grid.AutoSizeColumns()

app = wx.App()
frame = MyFrame(None, "CSV Viewer")
frame.Show()
app.MainLoop()

위 코드에서 open_csv 메서드는 파일 대화상자를 표시하여 사용자가 CSV 파일을 선택할 수 있도록 합니다. 선택된 파일은 read_csv 메서드를 사용하여 읽어옵니다. read_csv 메서드는 csv.reader를 사용하여 파일의 데이터를 읽어온 후, 그리드에 데이터를 표시합니다.

Excel 파일 읽기

Excel 파일도 마찬가지로 간단하게 읽고 데이터를 처리할 수 있습니다. wxPython은 xlrd 라이브러리를 통해 Excel 파일을 처리할 수 있습니다. 아래 예제는 wxPython에서 파일 대화상자를 사용하여 사용자로부터 Excel 파일을 선택하고, 선택된 파일을 읽어와서 그리드에 표시하는 코드입니다.

import wx
import xlrd

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title)

        self.panel = wx.Panel(self)
        self.grid = wx.grid.Grid(self.panel)

        self.button = wx.Button(self.panel, label="Open Excel")
        self.button.Bind(wx.EVT_BUTTON, self.open_excel)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.grid, 1, wx.EXPAND)
        sizer.Add(self.button, 0, wx.ALIGN_RIGHT)

        self.panel.SetSizer(sizer)

    def open_excel(self, event):
        wildcard = "Excel files (*.xls;*.xlsx)|*.xls;*.xlsx"
        dialog = wx.FileDialog(self, "Open Excel file", wildcard=wildcard,
                               style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)

        if dialog.ShowModal() == wx.ID_CANCEL:
            return

        filepath = dialog.GetPath()
        self.read_excel(filepath)

    def read_excel(self, filepath):
        workbook = xlrd.open_workbook(filepath)
        sheet = workbook.sheet_by_index(0)

        num_rows = sheet.nrows
        num_cols = sheet.ncols

        self.grid.CreateGrid(num_rows, num_cols)
        for row_num in range(num_rows):
            for col_num in range(num_cols):
                value = str(sheet.cell_value(row_num, col_num))
                self.grid.SetCellValue(row_num, col_num, value)

        self.grid.AutoSizeColumns()

app = wx.App()
frame = MyFrame(None, "Excel Viewer")
frame.Show()
app.MainLoop()

위 코드에서는 open_excel 메서드와 read_excel 메서드를 사용하여 Excel 파일을 열고 읽어옵니다. xlrd 라이브러리를 사용하여 파일을 열고, sheet_by_index 메서드를 사용하여 첫 번째 시트를 선택합니다. 그리고 그리드에 데이터를 표시합니다.

이제 위의 예제 코드를 사용하여 wxPython 애플리케이션에서 CSV 파일 및 Excel 파일을 읽어와서 데이터를 표시하는 기능을 구현할 수 있습니다. 이러한 기능을 활용하면 사용자가 입력한 데이터로부터 결과를 분석하거나, 데이터를 시각적으로 표현하는 등 다양한 활용법이 가능해집니다.