os.path.split
принимает только один аргумент:
>>> os.path.split('foo/bar')
('foo', 'bar')
Все, что он делает, это разделяет часть «содержащая директория» от части «имя файла», поэтому здесь директория, содержащая foo
, иимя файла bar
.Не существует понятия расширения имени файла - имена файлов могут содержать любое количество точек, и, например, bar.tex.txt.tar.gz
это просто имя bar.tex.txt.tar.gz
:
>>> os.path.split('bar.tex.txt.tar.gz')
('', 'bar.tex.txt.tar.gz')
Здесь нет директивной части, поэтому она пуста.
Результат filename = filedialog.askopenfilename()
, полученный от Tkinter, всегда представляет собой полный путь к существующему файлу (он основан на быстром эксперименте, а не на любомдокументация; документация выглядит немного тонкой ), поэтому после os.path.split
у вас всегда должна быть непустая часть каталога и часть имени файла.Однако, если все, что вам нужно, это заменить окончательное расширение .abc
на .def
, попробуйте сделать это, вообще не вызывая os.path.split
:
>>> filename = 'some arbitrary/name.with.dots/ending with foo.abc'
>>> os.path.splitext(filename)[0] + '.def'
'some arbitrary/name.with.dots/ending with foo.def'
Если вы хотите ограничить сопоставляемые расширенияВы можете сделать это с аргументом filedialog.askopenfilename()
.Документация подразумевает, что filedialog.askopenfilename()
возвращает пустую строку, если пользователь нажимает «отменить».Тем не менее, это похоже на истину только после хотя бы одного успешного выбора : вместо этого он возвращает пустой кортеж для самого первого "отмены".Так что, кажется, лучше всего проверить это с помощью if not filename
:
def browseFunc():
filename = filedialog.askopenfilename(title='select a file',
filetypes=(('py', '*.py'),
('all', '*')))
if not filename:
pathlabel.config(text='no path, you chose Cancel')
else:
pathlabel.config(text='current path {!r}'.format(filename))
Кстати, pathlib немного тяжеловесно для того, что вы делаете, но это удобный способвыразите все виды манипуляций, которые вы можете когда-либо делать с путями.