python一句话之利用文件对话框获取文件路径

一、需求

在写脚本的时候,有时候处理文件名会很复杂。如果直接在脚本中写死,移植性就不强。而且在处理多个文件时,灵活性不强。

所以就产生了一个需求,有没有在脚本中使用的文件对话框,用来图形化的选择文件,但是又不想自己写个界面,搞得很复杂。

https://stackoverflow.com/questions/9319317/quick-and-easy-file-dialog-in-python

stackoverflow上就有人提出了这样的需求。


二、解决方案

回答得分最多的就是使用python内部集成的tkinter图形库
Tkinter is the easiest way if you don't want to have any other dependencies. To show only the dialog without any other GUI elements, you have to hide the root window using the withdraw method。

(1)单文件

对于获取单个文件,可用:

python3:

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()

python2:

import Tkinter, tkFileDialog

root = Tkinter.Tk()
root.withdraw()

file_path = tkFileDialog.askopenfilename()

这里需要注意的是,实际只用到了filedialog.askopenfilename()函数来获取文件名,为什么前面还需要创建一个Tkinter.Tk()实例,然后将其隐藏呢(root.withdraw())?
因为在使用filedialog.askopenfilename()时调用了GUI组件,使用后需要有GUI进程来管理这个句柄。当我们注释掉root = Tkinter.Tk()和root.withdraw()后,再运行这段代码,可以发现filedialog.askopenfilename()后桌面会一直有个Tk窗口,而且处于未响应状态。


(2)多文件
对于获取多个文件,可用filedialog.askopenfilenames(),这个函数返回的一个包含多个文件路径的元组(tuple)。可以通过迭代来对每个文件操作,以实现批处理。

示例(批量读一个文件内容,然后写入另外一个文件中):

扫描二维码关注公众号,回复: 3498602 查看本文章
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilenames()
for f in file_path:
    fo = f.split('.')[0]+'.csv'
    with open(fo,'w') as foo:
        with open(f,'r') as fn:
            fn.readline()
            for line in fn.readlines():
                li = line.strip().split()
                foo.write('%f,%f\n'%(float(li[1]),float(li[0])))
                print(li)


三、其他方案

当然,还可以通过一些其他的库来实现同样的功能,如win32ui,wxPython,easygui


说一下easygui,这个库是对tk库的一个封装,目的是简单便捷的使用一些常用的对话框(像调用函数一样调用对话框),跟matlab中的一样,你不需要先显式创建一个窗体。举个例子(获取文件路径):

import easygui
path = easygui.fileopenbox()

获取文件名,只需要一行代码(不包括导入库操作)。
但是,这个库目前还停留在0.97版本(2014-12-20)。不知道存不存在一些bug没有修复。

猜你喜欢

转载自blog.csdn.net/shawpan/article/details/78759199