parsingaskopenfilenames()的结果?

我试图从Python 3.2中的tkinter.filedialog.askopenfilenames()获取文件名列表。

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

我期待输出是一个元组(或者也许是一个列表),每个元素包含一个文件名。 据我所知,它返回一个string,每个元素都包含在大括号内,如下所示:

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

这是我得到的,如果我尝试打印(文件)。 它看起来像格式化为某种types的列表,但似乎只是一个string。 我做错了什么,或者是这个函数的输出实际上是一个格式化为一个文件列表的string,我需要自己分割。

这实际上是Python版本2.6以来版本中的一个bug。 你可以在他们的跟踪器上找到问题,并且在注释中有一个解决方法(我没有亲自尝试这个解决方法,因为我在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)) 

我没有一个确切的答案,因为我仍然在Python 2.x,但在我的世界askopenfilenames返回一个元组,所以我怀疑它会改变这么多去3.x. 也许尝试作为一个列表铸造:

 filelist = list(files) 

或者通过迭代使用列表理解:

 filelist = [file for file in files] 

我支持Eldererathis的答案,是我在Linux,Mac OS X和Windows下为Python版本2.X(主要是2.5及以上)版本找到的最佳解决方案。 当一个tkFileDialog调用参数multiple=1askopenfilename(...,multiple=1)方法时,我无法在Windows下正常工作(Linux和Mac OS X很好),当选择一个文件时处理为'str'而不是'tuple' )。

我尝试了files = re.findall('\{(.*?)\}', files在注释中提示的files = re.findall('\{(.*?)\}', files ,但是它没有改变任何东西,我也尝试了files = tuple(files)files = list(files) ,但这不是我所见过的可行的解决方法。

到目前为止, files = tkRoot.master.splitlist(files)是什么工作在我测试过的所有环境(Win32,Win64,Linux32,Linux64,Mac OS X)。

查找时我刚刚发现这个问题,为什么我花大括号而不是正确的列表。

这是我的工作:

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

我注意到,当我在我的方法中使用askopenfilenames ,我从来没有看过返回的对象。 我已经把它作为一个元组,它工作正常。 所以知道它可以在for循环中迭代,将每个项目追加到一个新的空白列表中是有意义的。

我希望这可以帮助遇到这个错误的其他人。