1. 程式人生 > >python一句話之利用檔案對話方塊獲取檔案路徑

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)。可以通過迭代來對每個檔案操作,以實現批處理。

示例(批量讀一個檔案內容,然後寫入另外一個檔案中):

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沒有修復。