10
votes

Analyser les résultats de AskopenFileNames ()?

J'essaie d'obtenir une liste de noms de fichiers de tkinter.filedialog.askopenfilenames () à Python 3.2.

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


2 commentaires

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


@Gabe: Si cela se produit, je vous étranglerai personnellement quiconque mettra une attelle bouclée dans le nom du fichier.


5 Réponses :


0
votes

Je n'ai pas de réponse exacte pour vous, car je suis toujours coincé dans Python 2.x, mais dans mon monde, AskopenfileNames retourne un tuple, alors je doute que cela aurait tellement changé à 3.x. Peut-être essayez peut-être de casting comme liste: xxx

ou à l'aide d'une compréhension de la liste en itération sur celui-ci: xxx


0 commentaires

17
votes

Ceci est en fait un bogue sur la version Windows présente depuis autour de la version 2.6 de Python. Vous pouvez trouver le problème sur leur tracker , et il y a une solution de contournement dans les commentaires (je n'ai pas personnellement essayé de cela. Solution de contournement parce que je suis sur Linux, qui retourne un tuple approprié). Je ne suis pas au courant d'une solution depuis lors, et la question n'a pas été marquée comme fermée / résolue.

La solution de contournement suggérée dans le commentaire est essentiellement pour ce faire: P>

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))


4 commentaires

Merci, agréable de savoir. Cette solution de contournement n'a pas réellement fonctionné, mais une fois que je savais que c'était une chaîne avec ce format, ce n'était pas un problème de la transformer en liste. Salut utilisé cela à la place: fichiers = re.findall ('\ {(. *?) \}', Fichiers)


FWIW, le bogue toujours dans Python 2.7.3 et @ Paul's Solution de la solution d'utilisation en utilisant RE est probablement la solution de contournement la plus simple, bien que vous souhaitiez que cela soit conditionné si askopenfileNames () a retourné quelque chose d'autre qu'un tuple au cas où il est jamais corrigé.


Un autre bug est apparemment, il existe une limite sur le nombre de fichiers qui peuvent être sélectionnés à la fois - que j'ai vérifié à l'aide de Python 2.7.5. Voir la question limitation de quantité pour Fenêtre de dialogue Sélection de fichiers ou de clés dans un dictionnaire? .


Cela aurait dû être résolu en 2.7.7. Voir BOGS.PLYTHON.ORG/ISSUE19020 et bugs.python.org/issue5712 .



0
votes

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

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

jusqu'à présent, fichiers = tkroot.master.splitlist (fichiers) est ce qui fonctionne sous tous les environnements que j'ai testés (Win32, Win64, Linux32, Linux64, Mac OS X).


0 commentaires

0
votes

Je viens de trouver cette question lorsque j'attendais pourquoi j'avais des crochets bouclés au lieu d'une liste appropriée.

Voici mon travail autour de: P>

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


0 commentaires

1
votes

Lors de la mise en œuvre de cette méthode aujourd'hui, askopenfilenames renvoie un tuple de tous les fichiers choisis, pas la chaîne étrange avec des accolades bouclées (doit avoir été corrigée).

Curieusement, si le bouton Annuler est enfoncé ou si l'utilisateur sort de la fenêtre de navigation, une chaîne vide est renvoyée à la place d'une liste vide ou d'un tuple. Heureusement pour US Python reconnaît les chaînes comme objets itérables, ce qui signifie que vous pouvez toujours vérifier si len (filedialog.askopenfileNames ()) == 0 . .


0 commentaires