2010-11-07 12 views
9

Sto cercando di ottenere un elenco di nomi di file da tkinter.filedialog.askopenfilenames() in Python 3.2.Analizzare i risultati di askopenfilenames()?

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

mi aspettavo l'uscita di essere una tupla (o forse una lista) con ogni elemento contenente un nome di file. Per quanto posso dire, è restituendo una stringa con ogni elemento contenuto all'interno graffe-parentesi {} in questo modo:

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

Questo è ciò che ottengo se cerco di stampa (file). Sembra che sia formattato come un elenco di qualche tipo, ma sembra essere solo una stringa. Sto facendo qualcosa di sbagliato, o l'output di questa funzione è in realtà una stringa formattata come un elenco di file, che devo separare da solo.

+0

Eek! Cosa ottieni quando c'è una parentesi graffa ('{' o '}') in un nome file? – Gabe

+3

@Gabe: se ciò accade, personalmente strangolerò chiunque abbia inserito una parentesi graffa nel nome del file. –

risposta

14

Questo è in realtà un bug della versione di Windows che è stato presente fin intorno al 2,6 rilascio di Pitone. È possibile trovare il problema on their tracker e c'è una soluzione alternativa nei commenti (non ho provato personalmente questa soluzione perché sono su Linux, che restituisce una tupla corretta). Da allora non sono a conoscenza di una correzione e il problema non è stato contrassegnato come chiuso/risolto.

La soluzione suggerita nel commento è essenzialmente per fare questo:

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

Grazie, bello sapere. Quella soluzione alternativa in realtà non funzionava, ma una volta saputo che era una stringa con quel formato non era un problema trasformarla in una lista. HI invece usava questo: \t \t files = re.findall ('\ {(. *?) \}', Files) – Paul

+0

FWIW, il bug è ancora in Python 2.7.3 e la soluzione di @ Paul con 're' è probabilmente la soluzione più semplice, anche se si potrebbe voler renderlo condizionale sul fatto che 'askopenfilenames()' abbia restituito qualcosa di diverso da una 'tupla' nel caso in cui venga risolto. – martineau

+0

Un altro bug è apparentemente c'è un limite al numero di file che possono essere selezionati in una volta - che ho verificato usando Python 2.7.5. Vedere la domanda [Limitazione della quantità per la finestra di dialogo che seleziona i file o per le chiavi in ​​un dizionario?] (Http://stackoverflow.com/questions/17863290/quantity-limitation-for-dialog-window-selecting-files-or-for- chiavi-in-a-dictionar). – martineau

0

Non ho una risposta esatta per te, perché sono ancora bloccato in Python 2.x, ma nel mio mondo askopenfilenames restituisce una tupla, quindi dubito che sarebbe cambiato tanto andando a 3.x . Forse provare colata come una lista:

filelist = list(files) 

o utilizzando una lista di comprensione mediante iterazione su di esso:

filelist = [file for file in files] 
0

sostengo la risposta di Eldererathis come la soluzione migliore che ho trovato per Python versioni 2.x (principalmente 2,5 e sopra) le versioni sotto Linux, Mac OS X e Windows. Quando un tkFileDialog10 chiama i metodi askopenfilename(...,multiple=1) con l'argomento multiple=1, non riuscivo a farlo funzionare correttamente in Windows (Linux e Mac OS X andavano bene) quando veniva selezionato un singolo file (il file viene elaborato come 'str' anziché 'tuple').

Ho provato il files = re.findall('\{(.*?)\}', files suggerito da Paul nei commenti, ma non ha cambiato nulla. Ho anche provato files = tuple(files) e files = list(files), ma non è una soluzione valida da quello che ho visto.

Finora, files = tkRoot.master.splitlist(files) è ciò che funziona in tutti gli ambienti che ho testato (Win32, Win64, Linux32, Linux64, Mac OS X).

0

Ho appena trovato questa domanda quando ho cercato perché stavo ottenendo parentesi graffe invece di una lista corretta.

Ecco il mio lavoro intorno:

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

ho notato che quando ero con il askopenfilenames nel mio metodo non ho mai guardato l'oggetto restituito. L'ho trattato come una tupla e ha funzionato bene. Quindi, sapendo che poteva essere ripetuto in un ciclo for, aveva senso aggiungere ogni elemento in una nuova lista vuota.

Spero che questo aiuti chiunque altro incontri questo bug.

Problemi correlati