Разбор результатов askopenfilenames ()?

Я пытаюсь получить список имен файлов из tkinter.filedialog.askopenfilenames () в Python 3.2.

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

Я ожидал, что вывод будет кортежем (или, может быть, списком) с каждым элементом, содержащим имя файла. Насколько я могу судить, он возвращает строку с каждым элементом, содержащимся в фигурных скобках {} следующим образом:

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

Это то, что я получаю, если пытаюсь распечатать (файлы). Похоже, что он отформатирован как список какого-то рода, но кажется, что это просто строка. Я делаю что-то не так, или результат этой функции фактически представляет собой строку, отформатированную как список файлов, которую мне нужно разделить на себя.

На самом деле это ошибка в версии Windows, которая присутствует с момента выпуска версии Python 2.6. Вы можете найти проблему на своем трекере , и в комментариях есть обходное решение (я лично не пробовал это обходное решение, потому что я нахожусь в Linux, что возвращает правильный кортеж). С тех пор я не знаю об исправлении, и проблема не была отмечена как закрытая / разрешенная.

Предлагаемое обходное решение в комментарии состоит в том, чтобы сделать это:

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

У меня нет точного ответа для вас, потому что я все еще застрял в Python 2.x, но в моем мире askopenfilenames возвращает кортеж, поэтому я сомневаюсь, что он так сильно изменился бы до 3.x. Возможно, попробуйте кастинг в качестве списка:

 filelist = list(files) 

Или используя понимание списка, итерации по нему:

 filelist = [file for file in files] 

Я поддерживаю ответ Eldererathis как лучшее решение, которое я нашел для версий Python версии 2.X (в основном версии 2.5 и выше) под Linux, Mac OS X и Windows. Когда tkFileDialog вызывает askopenfilename(...,multiple=1) с аргументом multiple=1 , я не смог заставить его работать должным образом под Windows (Linux и Mac OS X были прекрасны), когда был выбран один файл (файл обрабатывается как 'str' вместо 'tuple' ).

Я пробовал files = re.findall('\{(.*?)\}', files предложенные Полом в комментариях, но это ничего не меняло. Я также пробовал files = tuple(files) и files = list(files) , но это не жизнеспособное обходное решение из того, что я видел.

Пока что files = tkRoot.master.splitlist(files) – это то, что работает во всех средах, которые я тестировал (Win32, Win64, Linux32, Linux64, Mac OS X).

Я просто нашел этот вопрос, когда посмотрел, почему я получаю фигурные скобки вместо правильного списка.

Вот моя работа:

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

Я заметил, что когда я использовал askopenfilenames в моем методе, я никогда не смотрел на возвращаемый объект. Я рассматривал его как кортеж, и он работал нормально. Поэтому, зная, что это можно повторить в цикле for, было бы целесообразно добавить каждый элемент в новый пустой список.

Надеюсь, это поможет любому, кто сталкивается с этой ошибкой.