我试图从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=1
的askopenfilename(...,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循环中迭代,将每个项目追加到一个新的空白列表中是有意义的。
我希望这可以帮助遇到这个错误的其他人。