Opening and Reading a csv file using read_csv from Tkinter GUI

Question:

from tkinter import filedialog, Label, Button, Entry, StringVar
from tkinter.filedialog import askopenfile
import pandas as pd

root = tk.Tk()
Label(root, text='File Path').grid(row=0, column=0)
v = StringVar()
entry = Entry(root, textvariable=v).grid(row=0, column=1)
Button(root, text='Browse Data Set',command=lambda:   v.set(askopenfile())).grid(row=1, column=0)
Button(root, text='Close',command=root.quit()).grid(row=1, column=1)
root.file = v.get()
df = pd.read_csv(root.file)
root.mainloop()

I want to open a dataset (CSV file) on the click of a button and read it using pd.read_csv() function i am getting some errors

Traceback (most recent call last):
  File "/home/abishek/PycharmProjects/untitled1/temp.py", line 21, in <module>
    df = pd.read_csv(root.file)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 498, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 275, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 590, in __init__
    self._make_engine(self.engine)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 731, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/lib/python3/dist-packages/pandas/io/parsers.py", line 1103, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "pandas/parser.pyx", line 353, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:3246)
  File "pandas/parser.pyx", line 591, in pandas.parser.TextReader._setup_parser_source (pandas/parser.c:6111)
OSError: File b'' does not exist

Process finished with exit code 1

Please Help me with this one i am new to Tkinter

I Have done the first part now i have an other problem

1.I browsed a file
2.I will get the columns of the data Frame using list(df) and i wanted it to displayed it in an option menu i am doing it with the following code

import tkinter as tk
from tkinter.filedialog import askopenfilename
import pandas as pd

root = tk.Tk()
v = tk.StringVar(root)
v1 = tk.StringVar(root)
v2 = tk.StringVar(root)
v3 = tk.StringVar(root)
df = pd.DataFrame()
col = []
ss = ['a','b','c','d','e']


def get_data_frame():
    global v
    global df
    global col
    file_name = askopenfilename()
    v.set(file_name)
    df = pd.read_csv(file_name)
    col = list(df)
    print(col)


def fill():
    return list(df)


tk.Label(root, text='File Path').grid(row=0, column=0)
entry = tk.Entry(root, textvariable=v).grid(row=0, column=1)
tk.Button(root, text='Browse Data Set', command=get_data_frame).grid(row=0, column=3)
tk.Label(root, text='Class LabelAttribute').grid(row=1, column=0)
tk.OptionMenu(root,v1,*col).grid(row=1, column=1)
v1.set('Nil')
tk.Label(root, text='Row Counter Attribute').grid(row=2, column=0)
v2.set('Nil')
tk.OptionMenu(root,v2,*col).grid(row=2, column=1)
tk.Button(root, text='Close', command=root.destroy).grid(row=5, column=3)
tk.Entry(root, textvariable=v3).grid(row=6, column=0)
tk.Button(root, text='Setter', command=lambda: v3.set(type(col[0]))).grid(row=6, column=1)
v3.set(col)
root.mainloop()
print(col)

but python is giving the following error

Traceback (most recent call last):
  File "/home/abishek/PycharmProjects/untitled1/GUI.py", line 34, in <module>
    tk.OptionMenu(root,v1,*col).grid(row=1, column=1)
TypeError: __init__() missing 1 required positional argument: 'value'
Asked By: Abishek Kumaresan

||

Answers:

As suggested by @Kevin, you need to put some of the functionality in to a function that is called when the button is pressed.
I’ve provided an example (I don’t have pandas installed, so the pandas part is commented out).
You also should be using askopenfilename not askopenfile.
I’ve also fixed your close button, note I’ve changed it to root.destroy and I haven’t put () at the end.

import tkinter as tk
from tkinter.filedialog import askopenfilename
#import pandas as pd


def import_csv_data():
    global v
    csv_file_path = askopenfilename()
    print(csv_file_path)
    v.set(csv_file_path)
    #df = pd.read_csv(csv_file_path)

root = tk.Tk()
tk.Label(root, text='File Path').grid(row=0, column=0)
v = tk.StringVar()
entry = tk.Entry(root, textvariable=v).grid(row=0, column=1)
tk.Button(root, text='Browse Data Set',command=import_csv_data).grid(row=1, column=0)
tk.Button(root, text='Close',command=root.destroy).grid(row=1, column=1)
root.mainloop()
Answered By: scotty3785

Just include print(df.head()) after df = pd.read_csv(csv_file_path), in next line within same function and you will get the answer.

Answered By: Rishi S

I believe this question has been answered in great detail, but here’s my two cents to what is a less-fancy, equally functional approach:

import tkinter as tk
from tkinter.filedialog import askopenfilename
import pandas as pd

root = tk.Tk()
root.withdraw() #Prevents the Tkinter window to come up
exlpath = askopenfilename()
root.destroy()
print(exlpath)
df = pd.read_excel(exlpath)
Answered By: Jose Morais

I entered what Jose wrote exactly in a Jupyter notebook, hit shift-enter, and nothing happened. I expected a dialog box to open.

Answered By: Kelly Cox
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.