2010-11-07 97 views
9

我試圖從Python 3.2中的tkinter.filedialog.askopenfilenames()獲取文件名列表。解析askopenfilenames()的結果?

files = askopenfilenames(initialdir="C:\\Users\\BVCAP\\Videos", title="Select files") 
    self.num_files.set(len(files)) 

我期待輸出是一個元組(或可能是一個列表),每個元素包含一個文件名。據我所知,它返回一個字符串,大括號{}內包含像這樣每一個元素:

{C:\Users\BVCAP\File1.txt} {C:\Users\BVCAP\File2.txt}

這是我所得到的,如果我嘗試打印(文件)。它看起來像格式化爲某種類型的列表,但它似乎只是一個字符串。我做錯了什麼,或者是這個函數的輸出實際上是一個格式化爲一個文件列表的字符串,我需要自己分割。

+0

Eek!當文件名中有一個大括號('{'或'}')時,你會得到什麼? – Gabe 2010-11-07 02:42:30

+3

@加貝:如果發生這種情況,我會親自扼殺在文件名中放置花括號的人。 – 2010-11-07 03:02:21

回答

14

這實際上是對Windows版本,因爲周圍的2.6版本中已經存在一個bug蟒蛇。你可以找到問題on their tracker,並且在評論中有一個解決方法(我沒有親自嘗試這種解決方法,因爲我在Linux上,它返回一個適當的元組)。自那時起,我不知道有任何修復,並且該問題未被標記爲已關閉/已解決。

在註釋中建議的解決方法是從根本上做到這一點:

master = Tk() 
files = askopenfilenames(initialdir="C:\\Users\\BVCAP\\Videos", title="Select files") 
files = master.tk.splitlist(files) #Possible workaround 
self.num_files.set(len(files)) 
+1

謝謝,很高興知道。該解決方法實際上並不奏效,但是一旦我知道這是一種具有該格式的字符串,將它變成列表並不是問題。你用這個代替:\t \t files = re.findall('\ {(。*?)\}',files) – Paul 2010-11-08 15:24:05

+0

FWIW,該錯誤仍在Python 2.7.3中,而@ Paul使用're'的解決方法大概是最簡單的解決方法,儘管您可能希望以「askopenfilenames()'是否返回除tuple之外的東西爲條件,以防萬一它得到解決。 – martineau 2012-11-09 21:09:13

+0

另一個bug顯然是一次可以選擇的文件數量有限制 - 我已經使用Python 2.7.5進行了驗證。查看問題[數量限制對話框窗口選擇文件或字典中的鍵?](http://stackoverflow.com/questions/17863290/quantity-limitation-for-dialog-window-selecting-files-or-for-for-鍵合A-dictionar)。 – martineau 2013-07-25 18:50:51

0

我沒有一個確切的答案給你,因爲我仍然停留在Python 2.x中,但在我的世界裏,askopenfilenames返回一個元組,所以我懷疑它會改變這麼多3.x 。也許嘗試鑄造的列表:通過遍歷它

filelist = list(files) 

或使用列表理解:

filelist = [file for file in files] 
0

我支持Eldererathis的答案,因爲我已經找到了Python版本2.X(主要是2.5及以上版本)版本的Linux下的最佳解決方案, Mac OS X和Windows。當tkFileDialog調用參數multiple=1askopenfilename(...,multiple=1)方法時,如果選擇單個文件(文件被處理爲'str'而不是'tuple'),我無法在Windows(Linux和Mac OS X很好)下正常工作。

我嘗試了Paul在評論中建議的files = re.findall('\{(.*?)\}', files,但它沒有改變任何東西。我也試過files = tuple(files)files = list(files),但它不是我所見過的可行的解決方法。

到目前爲止,files = tkRoot.master.splitlist(files)是在我測試過的所有環境(Win32,Win64,Linux32,Linux64,Mac OS X)下工作的。

0

查找時我剛剛發現這個問題,爲什麼我得到大括號而不是正確的列表。

這裏是我的解決方法:

file_list=[] 
files = files = askopenfilenames(initialdir="C:\\Users\\BVCAP\\Videos", title="Select files") 
for file in files: 
    file_list.append(file) 

我注意到,當我在我的方法使用askopenfilenames我從來沒有看過的對象返回。我已經把它當作一個元組來處理,並且它工作正常。因此,知道它可以在for循環中迭代,將每個項目追加到新的空白列表中是有意義的。

我希望這可以幫助任何遇到此錯誤的人。