解析askopenfilenames()的结果?
我正在尝试从Python 3.2中的tkinter.filedialog.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}
当我尝试打印(files)时,得到的就是这个结果。看起来它的格式像是某种列表,但实际上似乎只是一个字符串。我是不是做错了什么,还是这个函数的输出本身就是一个格式像文件列表的字符串,我需要自己把它分开呢?
5 个回答
我没有确切的答案给你,因为我还在用Python 2.x,但在我这边,askopenfilenames返回的是一个元组,所以我怀疑在3.x版本中变化不会太大。你可以试着把它转换成列表:
filelist = list(files)
或者可以用列表推导式来遍历它:
filelist = [file for file in files]
今天在实现这个方法时,askopenfilenames
返回的是一个包含所有选择文件的元组,而不再是之前那种奇怪的带大括号的字符串(这应该是修复过了)。
奇怪的是,如果用户按下取消按钮或者关闭浏览窗口,返回的会是一个空字符串,而不是一个空列表或元组。幸运的是,Python把字符串当作可迭代对象,这意味着你仍然可以检查 len(filedialog.askopenfilenames()) == 0
来判断是否没有选择文件。
其实这是Windows版本的一个bug,从大约Python 2.6版本开始就存在了。你可以在他们的跟踪系统上找到这个问题,链接在这里。评论里有一个解决办法(我个人没有尝试这个方法,因为我用的是Linux,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))