нужно динамически получать файл от пользователя - PullRequest
0 голосов
/ 11 июля 2019

Я пишу код, в котором я хочу, чтобы пользователь указал местоположение файла, и он запустит проверки, которые я кодировал.Здесь я жестко запрограммировал путь Excel, но я хочу, чтобы он был динамическим.

Я пытался Tkinter для кодирования и динамического чтения, но я получаю сообщение об ошибке:

from tkinter import *
from tkinter.ttk import *
import pandas as pd
import csv
from tkinter.filedialog import askopenfile

root = Tk()
root.geometry('200x100')


def open_file():
    file = askopenfile(mode ='r', filetypes =[('Python Files', 
    '*.csv')])
      if file is not None:
         content = file.read()
            print(content)

btn = Button(root, text ='Open', command = lambda:open_file())
btn.pack(side = TOP, pady = 10)
prac = askopenfile(mode ='r', filetypes =[('Python Files', 
'*.csv')])
 content = prac.read()

content["latlong"] ='FALSE'
content.loc[(content["LONGITUDE"] >= 70.0000) & 
(content["LONGITUDE"] <= 
98.0000) & (content["LONGITUDE"] != 'nan') & 
 (content["LATITUDE"] != 
'nan'), ["latlong"]] = 'TRUE'
 file.to_csv("C:/Users/patesari/Desktop/python 
 work/practice1.csv")
 writer = content[content["latlong"]=='TRUE']
 writer.to_csv('C:/Users/patesari/Desktop/python 
 work/newfile1.csv', 
 index=False)
 writer = content[content["latlong"]=='TRUE']
 writer.to_csv('C:/Users/patesari/Desktop/python
 work/outputfiles/latlong1.csv', index=False)
 mainloop()

#, но этот код даетошибка: content ["latlong"] = 'FALSE' #TypeError: объект 'str' не поддерживает назначение элементов.Этот код работает нормально для меня, но я прописал путь:

def latlong_func():
data = pd.read_csv(r'C:/Users/patesari/Desktop/python 
work/Gap1`.csv')
df = pd.DataFrame(data,columns=['SUPPLIER_ID','ACTION'])
data["latlong"] ='FALSE'
data.loc[(data["LONGITUDE"] >= 70.0000) & (data["LONGITUDE"] 
<= 98.0000)&
(data["LONGITUDE"] != 'nan') & (data["LATITUDE"] != 'nan'), 
["latlong"]] 
= 'TRUE'
data.to_csv("C:/Users/patesari/Desktop/python 
work/practice1.csv")
writer = data[data["latlong"]=='TRUE']
writer.to_csv('C:/Users/patesari/Desktop/python 
work/newfile1.csv', 
index=False)
writer = data[data["latlong"]=='TRUE']
writer.to_csv('C:/Users/patesari/Desktop/python 
work/outputfiles/latlong1.csv', index=False)

, что необходимо исправить, если я использую tkinter.и какой кусок кода я должен применить, если не использую tkinter

1 Ответ

0 голосов
/ 13 июля 2019

Вы должны использовать askopenfilename, чтобы получить имя файла вместо открытого файлового объекта. Имя файла, которое вы можете использовать с pd.read_csv(filename) вместо prac.read()

Итак, сначала я сделал функцию

def latlong_func(filename):
    data = pd.read_csv(filename)

    # rest

чтобы получить имя файла и использовать его с пандами.

А позже я сделал функцию

def get_filename():

    filename = askopenfilename(filetypes =[('Python Files', '*.csv')])

    if filename:
        lbl['text'] = filename
        latlong_func(filename)
    else:
        lbl['text'] = 'not selected'

, чтобы получить имя файла и выполнить latlong_func(filename). Он также отображает имя файла в Label в окне.

Эта функция назначена кнопке

btn = tk.Button(root, text='Open', command=get_filename)

Полный код:

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


def latlong_func(filename):
    # filename instead of r'C:/Users/patesari/Desktop/python work/Gap1.csv'
    data = pd.read_csv(filename)

    #df = pd.DataFrame(data, columns=['SUPPLIER_ID','ACTION'])

    data["latlong"] = 'FALSE'
    data.loc[
        (data["LONGITUDE"] >= 70.0000) & (data["LONGITUDE"] <= 98.0000) &
        (data["LONGITUDE"] != 'nan') & (data["LATITUDE"] != 'nan'),
        ["latlong"]
    ] = 'TRUE'

    data.to_csv("C:/Users/patesari/Desktop/python work/practice1.csv")

    writer = data[data["latlong"]=='TRUE']
    writer.to_csv('C:/Users/patesari/Desktop/python work/newfile1.csv', index=False)
    writer.to_csv('C:/Users/patesari/Desktop/python work/outputfiles/latlong1.csv', index=False)


def get_filename():

    filename = askopenfilename(filetypes =[('Python Files', '*.csv')])

    if filename:
        lbl['text'] = filename # display filename in Label
        latlong_func(filename)
    else:
        lbl['text'] = 'not selected'


# --- main ---

root = tk.Tk()
root.geometry('200x100')

lbl = tk.Label(root, text='Select filename')
lbl.pack(side='top', pady=10)

btn = tk.Button(root, text='Open', command=get_filename)
btn.pack(side='top', pady=10)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...