2010-11-07 14 views
9

Próbuję uzyskać listę nazw plików od tkinter.filedialog.askopenfilenames() w Pythonie 3.2.Parsowanie wyników askopenfilenames()?

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

Oczekiwano, że wynik będzie krotką (a może listą) z każdym elementem zawierającym nazwę pliku. O ile mogę powiedzieć, to ciąg powrocie z każdego elementu zawartego w kręconych nawiasach {} tak:

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

To co mam, jeśli spróbuję druku (pliki). Wygląda na to, że jest sformatowany jak lista, ale wydaje się być po prostu łańcuchem znaków. Czy robię coś nie tak, lub jest wyjściem tej funkcji w rzeczywistości ciąg sformatowany jak lista plików, którą muszę podzielić samodzielnie.

+0

Eek! Co otrzymujesz, gdy w nazwie pliku znajduje się nawias klamrowy ('{' lub '}')? – Gabe

+3

@Gabe: jeśli to się zdarzy, osobiście udusę kogoś, kto umieścił nawias klamrowy w nazwie pliku. –

Odpowiedz

14

Właściwie jest to bug od wersji systemu Windows, która była obecna od około 2.6 wydaniu Pyton. Możesz znaleźć numer on their tracker i istnieje obejście tego komentarza (osobiście nie próbowałem tego obejścia, ponieważ jestem na Linuksie, który zwraca poprawną krotkę). Od tego czasu nie mam informacji o poprawce, a problem nie został oznaczony jako zamknięty/rozwiązany.

Sugerowana obejście w komentarzu jest zasadniczo to zrobić:

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

Dzięki, miło wiedzieć. To obejście nie zadziałało, ale gdy już wiedziałem, że to ciąg znaków w tym formacie, nie było problemu z przekształceniem go na listę. HI użył tego zamiast: \t \t files = re.findall ('\ {(. *?) \}', Pliki) – Paul

+0

FWIW, błąd wciąż w Pythonie 2.7.3 i obejściu @ Paula przy użyciu 're' jest prawdopodobnie najprostsze obejście, chociaż możesz chcieć uzależnić to od tego, czy 'askopenfilenames()' zwrócił coś innego niż 'krotkę' na wypadek, gdyby kiedykolwiek zostało naprawione. – martineau

+0

Kolejny błąd najwyraźniej istnieje ograniczenie liczby plików, które można wybrać jednocześnie - co sprawdziłem za pomocą Pythona 2.7.5. Zobacz pytanie [Ograniczenie ilości w oknie dialogowym wyboru plików lub kluczy w słowniku?] (Http://stackoverflow.com/questions/17863290/quantity-limitation-for-dialog-window-selecting-files-or-for- keys-in-a-dictionar). – martineau

0

Nie mam dla ciebie dokładnej odpowiedzi, ponieważ utknąłem w Pythonie 2.x, ale w moim świecie askopenfilenames zwraca krotkę, więc wątpię, by tak bardzo zmieniło się 3.x . Może spróbuj odlewania w formie listy:

filelist = list(files) 

lub używając wyrażeń listowych przez iteracji nad nim:

filelist = [file for file in files] 
0

Popieram odpowiedź Eldererathis jako najlepszego rozwiązania znalazłem dla Pythona wersji 2.x (głównie 2,5 i powyżej) wersje pod Linuksa Mac OS X i Windows. Gdy tkFileDialog nazywa się metodami z argumentem multiple=1, nie mógłbym uzyskać prawidłowego działania pod Windows (Linux i Mac OS X były w porządku) po wybraniu jednego pliku (plik jest przetwarzany jako 'str' zamiast 'tuple').

Wypróbowałem files = re.findall('\{(.*?)\}', files zasugerowany przez Pawła w komentarzach, ale nic nie zmieniło. Próbowałem również files = tuple(files) i files = list(files), ale nie jest to realne obejście tego, co widziałem.

Do tej pory pracowałem pod wszystkimi testowanymi środowiskami (Win32, Win64, Linux32, Linux64, Mac OS X).

0

Właśnie znalazłem to pytanie, szukając dlaczego otrzymywałem nawiasy klamrowe zamiast właściwej listy.

Oto moja praca wokół:

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

Zauważyłem, że kiedy byłem przy użyciu askopenfilenames w moim metoda nigdy nie spojrzał na obiekt zwrócony. Traktowałem to jako krotkę i wszystko działało dobrze. Więc wiedząc, że może to być iterowane w pętli for, sensowne było dołączanie każdego elementu do nowej pustej listy.

Mam nadzieję, że pomoże to każdemu, kto napotka ten błąd.