Разбор результатов аскопенфайлов ()? - PullRequest
10 голосов
/ 07 ноября 2010

Я пытаюсь получить список имен файлов из 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}

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

Ответы [ 4 ]

15 голосов
/ 07 ноября 2010

На самом деле это ошибка в версии 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))
0 голосов
/ 11 июля 2017

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

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

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

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

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

0 голосов
/ 01 июля 2015

Я поддерживаю ответ 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).

0 голосов
/ 07 ноября 2010

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

filelist = list(files)

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

filelist = [file for file in files]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...