【问题标题】:need to take the file from user dynamically需要动态地从用户那里获取文件
【发布时间】:2019-11-21 01:21:31
【问题描述】:

我正在编写一个代码,我希望用户提供文件的位置,它将运行我编写的检查。 在这里,我已经硬编码了 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 应该申请

【问题讨论】:

  • 看看 argparse 它将帮助您了解如何从命令行传递 arg。 docs.python.org/2/howto/argparse.html
  • 你应该使用askopenfilename 而不是askopenfile 来获取文件名而不是打开的文件对象。然后您可以将文件名与 pd.read_csv 一起使用。使用content = prac.read(),您将其读取为纯文本,因此您可以在content 中的一个字符串中获取所有内容,因此您不能像DataFrame 那样使用它,也不能使用content[...]

标签: python tkinter


【解决方案1】:

您应该使用askopenfilename 来获取文件名而不是打开的文件对象。您可以使用 pd.read_csv(filename) 代替 prac.read() 的文件名

所以首先我做了函数

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

    # rest

所以它获取文件名并将其与 pandas 一起使用。

后来我做了函数

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()

【讨论】:

  • 谢谢它对我有用..你能告诉我是否要读取两个 csv 文件
  • get_filename 中使用askopenfilename() 两次或使用askopenfilenames() - 最后带有s - 这让您可以在对话框窗口中选择许多文件,并提供包含所有选定文件名的列表或空列表。
  • 我在解决将其更改为 askopen 文件名时遇到错误。我的数据在两个不同的文件中,现在当我想比较这些文件时,我该怎么做。请您帮忙
  • 您可以使用filename1 = askopenfilename(..)filename2 = askopenfilename(..),您将拥有两个变量中的文件,您会知道哪个是第一个。或者你可以使用filenames = askopenfilenames(..),最后带有s,然后你有文件列表,你必须使用filenames[0]filenames[1]。我不知道使用askopenfilenames 是否可以控制哪个文件将在列表中排在首位 - 您首先在对话框窗口中单击哪个文件,否则它会按字母顺序对它们进行排序。
  • 你能帮我解决这个问题吗stackoverflow.com/questions/57162499/…
猜你喜欢
  • 2014-04-02
  • 2018-07-07
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 2011-12-24
相关资源
最近更新 更多