2010-11-07 5 views
9

J'essaye d'obtenir une liste de noms de fichiers de tkinter.filedialog.askopenfilenames() dans Python 3.2.Analyser les résultats de askopenfilenames()?

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

J'attendais que la sortie soit un tuple (ou peut-être une liste) avec chaque élément contenant un nom de fichier. Pour autant que je peux dire, il est retourne une chaîne avec chaque élément contenu dans curly-accolades {} comme ceci:

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

C'est ce que je reçois si je tente d'impression (fichiers). On dirait qu'il est formaté comme une sorte de liste, mais il semble que ce soit juste une chaîne. Est-ce que je fais quelque chose de mal, ou est la sortie de cette fonction en fait une chaîne formatée comme une liste de fichiers, que je dois séparer par moi-même.

+0

Eek! Qu'est-ce que vous obtenez quand il y a une accolade ('{' ou '}') dans un nom de fichier? – Gabe

+3

@Gabe: si cela arrive, j'étranglerai personnellement celui qui mettra une accolade dans le nom du fichier. –

Répondre

14

Ceci est en fait un bug sur la version Windows qui a été présente depuis environ la version 2.6 de Python. Vous pouvez trouver le numéro on their tracker, et il y a une solution de contournement dans les commentaires (je n'ai pas personnellement essayé cette solution de contournement car je suis sur Linux, ce qui renvoie un tuple correct). Je ne suis pas au courant d'une solution depuis lors, et le problème n'a pas été marqué comme fermé/résolu.

La solution proposée dans le commentaire est essentiellement de faire ceci:

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

Merci, bon à savoir. Cette solution de contournement n'a pas fonctionné réellement, mais une fois que j'ai su que c'était une chaîne avec ce format ce n'était pas un problème pour le transformer en liste. HI a utilisé ceci à la place: \t \t files = re.findall ('\ {(. *?) \}', Fichiers) – Paul

+0

FWIW, le bug est toujours en Python 2.7.3 et la solution de @ Paul en utilisant 're' est probablement la solution de contournement la plus simple, bien que vous souhaitiez la rendre conditionnelle à savoir si 'askopenfilenames()' a renvoyé autre chose qu'un 'tuple' au cas où il serait corrigé. – martineau

+0

Un autre bug est apparemment qu'il y a une limite sur le nombre de fichiers qui peuvent être sélectionnés en même temps - ce que j'ai vérifié en utilisant Python 2.7.5. Voyez la question [Limitation de quantité pour la boîte de dialogue sélection des fichiers ou pour les clés dans un dictionnaire?] (Http://stackoverflow.com/questions/17863290/quantity-limitation-for-dialog-window-selection-files-or-for- keys-in-a-dictionar). – martineau

0

Je n'ai pas de réponse exacte pour vous, parce que je suis toujours coincé dans Python 2.x, mais dans mon monde askopenfilenames retourne un tuple, donc je doute qu'il aurait tellement changé en passant à 3.x . Peut-être essayer casting comme une liste:

filelist = list(files) 

ou en utilisant une compréhension de la liste par itérer dessus:

filelist = [file for file in files] 
0

Je soutiens la réponse de Eldererathis comme la meilleure solution que j'ai trouvé pour les versions Python versions 2.X (principalement 2.5 et plus) sous Linux, Mac OS X et Windows. Quand un tkFileDialog appelle les méthodes askopenfilename(...,multiple=1) avec l'argument multiple=1, je ne pouvais pas le faire fonctionner correctement sous Windows (Linux et Mac OS X allaient bien) lorsqu'un seul fichier a été sélectionné (le fichier est traité comme 'str' au lieu d'un 'tuple').

J'ai essayé le files = re.findall('\{(.*?)\}', files suggéré par Paul dans les commentaires, mais cela n'a rien changé. J'ai également essayé files = tuple(files) et files = list(files), mais ce n'est pas une solution de contournement viable de ce que j'ai vu.

Jusqu'ici, files = tkRoot.master.splitlist(files) est ce qui fonctionne dans tous les environnements que j'ai testés (Win32, Win64, Linux32, Linux64, Mac OS X).

0

Je viens de trouver cette question quand je cherchais pourquoi je recevais des accolades au lieu d'une liste correcte.

Voici mon travail autour de:

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

je remarquai que quand j'utilisais la askopenfilenames dans ma méthode que je ne regardais jamais l'objet retourné. Je l'avais traité comme un tuple et cela a bien fonctionné. Donc, sachant qu'il pourrait être itéré dans une boucle for, il était logique d'ajouter chaque élément dans une nouvelle liste vide. J'espère que cela aidera tous ceux qui rencontrent ce bogue.

Questions connexes