【问题标题】:Quantity limitation for dialog window selecting files?对话框窗口选择文件的数量限制?
【发布时间】:2013-07-25 15:46:27
【问题描述】:

Python 版本:2.7 Tk 版本:8.5

参考我之前的问题how to add the selected files from dialog window to a dictionary?

我正在尝试从对话框窗口中选择 500 个文件并将它们的名称提取为字典的键。总文件大小约为 200M。 我不知道为什么我有一本空字典。但是,如果我每次选择较少的文件(例如 100 个),则每次都可以很好地工作。所以我的问题是对话框窗口选择文件或字典中的键是否有数量限制?

sys.path.append("C:\MY PATH")
os.environ['PATH']+=";C:\MY PATH"

print "Please select your txt files in the dialog window >>"
filez = tkFileDialog.askopenfilenames(parent=root,multiple='multiple',title='Choose a file',filetypes=[('txt file','.txt'),('All files','.*')])

mydict = {}
for FilenameWithPath in filez:
    path, Filename = os.path.split(str(FilenameWithPath))
##    Filename = sys.path.basename(FilenameWithPath)
    mydict[Filename] = len(mydict)
print "mydict " + str(mydict)   
print "\n"

如果我选择所有 500 个文件,它只会给出

mydict {}

有什么解决办法吗?谢谢。

【问题讨论】:

  • 对不起,不知道是不是我理解错了,但是你是说用户实际上会从文件对话框中手动选择500个文件?如果有一种系统的方法来确定您正在使用哪些文件而不是用户输入,那么我建议使用类似 os.walk() 的方法来检查目录结构并获取所需文件的详细信息。请您提供有关您的要求的更多信息。
  • @ChrisProsser,是的,它是手动的,b/c 可以更灵活地选择你想要的。谢谢你的推荐。我改了代码,你能检查一下吗?
  • @ChrisProsser 我注意到这里的错误,结果返回一个 unicode 字符串。不知何故,有时它会在期望列表中返回。
  • @Shengen:它是否返回 unicode 字符串取决于您选择了多少文件——相对较少的文件似乎可以工作,但数量不多,这似乎是您的错误发现了。

标签: python file limit tk


【解决方案1】:

我想我可以看到问题出在哪里。我做了一点调试,发现返回到 filez 的数据类型是一个 unicode 字符串(你似乎期待一个列表或元组)。

您需要在循环之前进行转换。如果您的文件名都不包含空格,这应该只是一个简单的问题:

file_list = files.split()

但是,如果不是这种情况,则上述方法将不起作用,并且包含空格的文件名用花括号 {} 括起来。

根据this page,这实际上可能是一个错误。但是,也建议将字符串转换为元组:

file_list=  master.tk.splitlist(filez)

希望这会有所帮助。

【讨论】:

  • 是的,返回一个 unicode 字符串是一个已知的错误——实际上,我使用的解决方法是file_list = re.findall('\{(.*?)\}', file_list)。无论如何,即使有了该修复程序,当我选择大量文件时,我也能够在 Python 2.7.5 中始终如一地重现 OP 的错误,否则很好。该错误似乎在Tkinter 模块或tk/tcl 库本身的深处,因为我可以看到它已经发生在几个较高的纯Python 级别。
  • FWIW,这是一个与 unicode 字符串问题相关的 SO 问题:Parsing the results of askopenfilenames()?。顺便说一句,对已接受答案的评论说 splitlist() 不起作用。
  • @martineau 根据link,当我设置master=Tk(),并返回错误:name 'Tk' is not defined ,我应该为它导入什么? import Tkinter?
  • @Shengen:要运行链接中的代码,请添加from Tkinter import *from tkFileDialog import askopenfilenames
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多