Python открыть проводник для выбора файла
Эта статья посвящена работе с файлами (вводу/выводу) в Python: открытие, чтение, запись, закрытие и другие операции.
Окна выбора ответа
Другие типы диалоговых окон в Tkinter используются для запроса подтверждения от пользователя. Это нужно, например, при сохранении файла или перезаписывании существующего.
Эти окна отличаются от ранее рассмотренных тем, что значения, возвращаемые функцией, зависят от кнопки, по которой кликнул пользователь. Это позволяет взаимодействовать с программой: продолжать или же отменять действие.
В этой программе рассмотрим остальные диалоговые функции из модуля tkinter.messagebox . Каждая кнопка включает метки с описанием типа окна, которое откроется при нажатии:
У них есть кое-какие отличия, поэтому стоит попробовать каждое из окон, чтобы разобраться в них.
Как и в прошлом примере сначала нужно импортировать tkinter.messagebox с помощью синтаксиса import … as и вызывать каждую из функций вместе с title и message :
Метод close()
После открытия файла в Python его нужно закрыть. Таким образом освобождаются ресурсы и убирается мусор. Python автоматически закрывает файл, когда объект присваивается другому файлу.
Существуют следующие способы:
Способ №1
Проще всего после открытия файла закрыть его, используя метод close() .
После закрытия этот файл нельзя будет использовать до тех пор, пока заново его не открыть.
Способ №2
Также можно написать try/finally , которое гарантирует, что если после открытия файла операции с ним приводят к исключениям, он закроется автоматически.
Без него программа завершается некорректно.
Вот как сделать это исключение:
Файл нужно открыть до инструкции try , потому что если инструкция open сама по себе вызовет ошибку, то файл не будет открываться для последующего закрытия.
Этот метод гарантирует, что если операции над файлом вызовут исключения, то он закроется до того как программа остановится.
Способ №3
Как работают окна с уведомлениями
В первую очередь нужно импортировать модуль tkinter.messagebox , задав для него алиас mb . В Python2 этот модуль назывался tkMessageBox , поэтому такой синтаксис позволит изолировать проблемы совместимости.
Каждое окно обычно выбирается в зависимости от информации, которую нужно показать пользователю:
- showinfo — операция была завершена успешно,
- showwarning — операция была завершена, но что-то пошло не так, как планировалось,
- showerror — операция не была завершена из-за ошибки.
Регулярные выражения
Регулярные выражения — это специальные шаблоны для поиска и замены строк в тексте. Вообще говоря, их вполне можно считать самостоятельным языком, и его изучение выходит за рамки этого цикла. Мы пройдемся по самым основам и по использованию регулярок в Python.
Подробнее о регэкспах ты можешь почитать в документации Python, в Википедии или в книге Джеффри Фридла, которая так и называется — «Регулярные выражения».
За работу с регулярными выражениями в Python отвечает модуль re. Первым делом импортируем его.
В качестве простейшего паттерна мы можем использовать какое‑нибудь слово. Пусть по традиции это будет «пиво»:
string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "
Команда re. search( pattern, string) ищет в тексте string первое вхождение шаблона pattern и возвращает группу строк, доступ к которым можно получить через метод . group( ) . Но команда search ищет только первое вхождение шаблона. Поэтому в нашем случае вернется всего один результат — слово «пиво», несмотря на то что в нашем тексте оно присутствует дважды.
Чтобы вернуть все вхождения шаблона в текст, используется команда re. findall( pattern, string) . Эта команда вернет список строк, которые присутствуют в тексте и совпадают с шаблоном.
string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "
Обрати внимание, что шаблоны в регулярных выражениях имеют буковку r перед началом строки. Это так называемые сырые строки, в которых не работает символ экранирования с помощью обратного слеша \ . При этом «сырая» строка не может заканчиваться этим символом.
В предыдущих двух примерах программ в качестве шаблона pattern для поиска строк ты использовал просто какое‑то слово. Но мощь регулярных выражений не в этом. Ты можешь заменять части шаблона специальными символами, чтобы под шаблон подходили не только конкретные слова, но и самые разные строки.
Давай, например, попробуем найти в тексте все слова, которые начинаются с «пи». Для этого используем специальный символ \ b — он означает «начало слова». Сразу после него указываем, с чего должно начинаться слово, и напишем специальный символ w , который означает, что дальше в шаблоне должны идти какие‑то буквы (плюс означает, что их может быть одна или больше) до тех пор, пока не встретится небуквенный символ (например, пробел или знак препинания). Шаблон будет выглядеть так: r"\ bпи\ w+" .
string = "Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян. "
Краткая справка по специальным символам
Давай попробуем выполнить чуть более сложную задачу. Найдем в тексте все email с доменом mail. ru , если они там есть.
string = "Если вы хотите связаться с админом, пишите на почту admin@mail. ru. По другим вопросам обращайтесь на support@mail. ru. "
Как видишь, мы использовали тот же трюк, что и в прошлый раз, — написали специальный символ \ b , чтобы обозначить начало слова, потом \ w+ , что значит «одна или больше букв», а затем @mail. ru , заэкранировав точку, поскольку иначе она будет означать «любой символ».
Часто бывает нужно найти какой‑то элемент строки, окруженный двумя другими элементами. Например, это может быть URL. Чтобы выделить ту часть шаблона, которую нужно вернуть, используются скобки. Приведу пример, в котором ты получишь все адреса ссылок из какого‑то кусочка кода на HTML.
В коде выше использовался паттерн r'href — в этом шаблоне искомая строка начинается с href code47">result . Точка и плюс внутри скобок указывают, что внутри кавычек могут быть любые символы (кроме символа новой строки). Знак вопроса означает, что нужно остановиться перед первой же встреченной кавычкой.
Знак вопроса в регулярных выражениях используется в двух немного разных смыслах. Если он идет после одного символа, это значит, что символ может присутствовать или не присутствовать в строке. Если же вопросительный знак идет после группы символов, это означает «нежадный» (non-greedy) режим: такая регулярка будет стараться захватить как можно меньше символов.
Мы можем не только искать строки, но и заменять их чем‑то другим. Например, давай попробуем удалить из HTML-кода все теги. Для этого используется команда re. sub( pattern, 'чем заменять', string) .
Программа напечатает строку уже без тегов, так как мы заменили их пустой строкой.
Регулярные выражения — очень мощная штука. Освоив их, ты сможешь делать со строками почти все, что угодно, а в сочетании с кодом на Python — буквально что угодно. Для начала же можешь поэкспериментировать и изменить какие‑то из приведенных рецептов.
Инструкция with
Еще один подход — использовать инструкцию with , которая упрощает обработку исключений с помощью инкапсуляции начальных операций, а также задач по закрытию и очистке.
В таком случае инструкция close не нужна, потому что with автоматически закроет файл.
Вот как это реализовать в коде.
Selecting multiple files
The askopenfilenames() function displays a file dialog for multiple file selections. It returns the selected file names as a tuple. For example:
Работаем с файлами
Начнем, как всегда, с несложных вещей. В Python есть модуль с лаконичным названием os , который (ты не поверишь!) предназначен для взаимодействия программы с операционной системой, в том числе для управления файлами.
Первым делом, конечно, нужно импортировать его в начале нашего скрипта:
И теперь нам открываются разные интересные возможности. К примеру, мы можем получить путь к текущей папке. Сначала она совпадает с той, в которой ты был при запуске скрипта (даже если сам скрипт находится где‑то в другом месте), но по ходу исполнения программы мы можем менять это значение при помощи функции os. chdir( ) .
Если ты работаешь в Windows, то в пути к файлу или папке перед открывающей кавычкой указывай букву r (что означает raw) или вместо одной косой черты в пути ставь две.
Попробуем получить список файлов с расширением .py, находящихся в текущей директории. Для этого используем модули os и fnmatch.
Модуль fnmatch позволяет искать в строках определенный текст, подходящий по маске к заданному шаблону:
- * заменяет любое количество любых символов;
- ? заменяет один любой символ;
- [ seq] заменяет любые символы из последовательности в квадратных скобках;
- [! seq] заменяет любые символы, кроме тех, что присутствуют в квадратных скобках.
Давай безжалостно удалим какой‑нибудь файл:
А теперь создадим папку по указанному пути и сразу же удалим ее. Для этого пригодится модуль shutil, где есть функция rmtree( ) , которая удаляет папку вместе с содержимым.
Допустим, ты хочешь получить список всех файлов, содержащихся в папках по указанному пути (учитывая вложенные папки тоже), чтобы найти что‑то интересное. Скрипт будет выглядеть следующим образом:
warning
Будь осторожен — скрипт в таком виде обшарит весь диск D. Если он у тебя есть и там много хлама, то процесс может затянуться.
Функция walk() модуля os принимает один обязательный аргумент — имя каталога. Она последовательно проходит все вложенные каталоги и возвращает объект‑генератор, из которого получают:
- адрес очередного каталога в виде строки;
- список имен подкаталогов первого уровня вложенности для данного каталога;
- список имен файлов данного каталога.
Генератор — это объект, который сразу при создании не вычисляет значения всех своих элементов. Этим генераторы отличаются от списков — те хранят в памяти все свои элементы, и удалить их можно только программно. Вычисления с помощью генераторов называются ленивыми, они экономят память. Подробнее мы рассмотрим генераторы в следующих уроках.
Сейчас покажу, как узнать размер любого файла, а также дату его модификации.
Для операционных систем Unix 1 января 1970, 00:00:00 (UTC) — точка отсчета времени, или «начало эпохи». Чаще всего время в компьютере вычисляется в виде прошедших с этого момента секунд и лишь затем переводится в удобный для человека вид.
Давай пошутим над юзером: создадим какой‑нибудь файл и будем постоянно его открывать с помощью той программы, которой этот файл обычно открывается в системе:
Ниже приведен список еще некоторых полезных команд:
- os. path. basename( 'путь') — возвращает название файла или папки в конце пути;
- os. path. dirname( 'путь') — возвращает родительский путь к объекту пути;
- os. path. splitext( 'путь') — разделяет путь на путь и расширение файла;
- os. path. exists( 'путь') — существует ли путь до файла или папки;
- os. path. isfile( 'путь') — является ли объект пути файлом (существующим);
- os. path. isdir( 'путь') — является ли объект пути папкой (существующей).
Текстовые файлы
Это файлы с человекочитаемым содержимым. В них хранятся последовательности символов, которые понимает человек. Блокнот и другие стандартные редакторы умеют читать и редактировать этот тип файлов.
Текст может храниться в двух форматах: ( .txt ) — простой текст и ( .rtf ) — «формат обогащенного текста».
11 Answers 11
How about using tkinter?
I had to do root = Tk.Tk() then root.withdraw(). Now the open file dialog window does not close however.
Is there any way to allow only certain types of files? for eg. I want the user to select image files only
Python 3.x version of Etaoin's answer for completeness:
this does not work for me (on Mac, Python 3.6.6) The GUI window opens but you cannot close it and you get beachball of death
This is the best solution so far. The main reason is that easygui is a pip package and easy to install
On Mac OSX 10.14.5, python 3.6.7, easygui 0.98.1 I get a horrible crash when I try this. Not recommended.
In Python 2 use the tkFileDialog module.
In Python 3 use the tkinter.filedialog module.
This worked for me
I had a situation where I was developing a Python server application (no GUI component) and hence didn't want to introduce a dependency on any python GUI toolkits, but I wanted some of my debug scripts to be parameterized by input files and wanted to visually prompt the user for a file if they didn't specify one on the command line. Zenity was a perfect fit. To achieve this, invoke "zenity --file-selection" using the subprocess module and capture the stdout. Of course this solution isn't Python-specific.
Zenity supports multiple platforms and happened to already be installed on our dev servers so it facilitated our debugging/development without introducing an unwanted dependency.
I obtained much better results with wxPython than tkinter, as suggested in this answer to a later duplicate question:
The wxPython version produced the file dialog that looked the same as the open file dialog from just about any other application on my OpenSUSE Tumbleweed installation with the xfce desktop, whereas tkinter produced something cramped and hard to read with an unfamiliar side-scrolling interface.
Распространенный сценарий применения диалоговых окон — уведомление пользователей о событиях, которые происходят в приложении: сделана новая запись или произошла ошибка при попытке открыть файл. Рассмотрим базовые функции Tkinter, предназначенные для отображения диалоговых окон.
При запуске этого примера стоит обратить внимание на то, что каждое окно воспроизводит соответствующий платформе звук и показывает перевод метки в зависимости от языка системы:
Эти диалоговые окна открываются с помощью функций showinfo , showwarning и showerror из модуля tkinter.messagebox :
Функции
Пришла пора подробнее поговорить о функциях. Мы уже неоднократно вызывали разные функции — как встроенные в Python (например, print( ) ), так и из подключаемых модулей (например, urllib. request( ) ). Но что такое функция изнутри и как их делать самостоятельно?
Представь, что у тебя есть какой‑то набор команд, которые нужно выполнять несколько раз, изменяя лишь входные данные. Такие блоки команд обычно выносят в отдельные кусочки программы.
В объектно ориентированном программировании функции являются методами какого‑либо класса и пишутся через точку от его названия.
У функции могут быть входные параметры — это одна или несколько переменных, которые пишутся в скобках после имени функции. При вызове функции ты можешь передать ей аргументы для этих параметров. Некоторые из параметров могут быть необязательными или иметь значение по умолчанию — на случай, если его не передадут.
Объявление функции начинается с ключевого слова def , далее следует имя функции, параметры в скобках и программный код, отделенный четырьмя пробелами. Функция может возвращать одно или несколько значений с помощью ключевого слова return . Оно, кстати, прекращает работу функции, и, если за ним идут какие‑то команды, они будут пропущены.
Для примера разберем простейшую функцию, которая будет принимать в качестве аргументов два любых числа и перемножать их, возвращая результат умножения. Назовем ее umn.
Теперь, когда ты описал функцию, далее в этой же программе можно ее вызывать.
Иногда надо задать один из параметров как необязательный, установив для него значение по умолчанию.
Теперь если ты вызовешь функцию и не передашь ей второй аргумент, то она просто будет считать его равным десяти, то есть будет умножать любое переданное число на десять.
Несмотря на то что параметр b в данном случае равен по умолчанию 10 и необязателен для передачи в качестве второго аргумента, ты по‑прежнему можешь передавать второй аргумент, если это будет нужно, и тогда в качестве b будет использовано не 10 , а переданное значение.
Внутри программы мы можем вызывать созданную нами функцию сколько угодно раз.
Давай создадим программу, которая будет считать прибавку к зарплате за каждую уязвимость, которую хакер нашел на работе. У каждого хакера будет своя зарплата, в зависимости от его ранга, но начисление прибавки для всех работает по принципу «+2% к базовой зарплате за уязвимость, если таких уязвимостей найдено больше чем три».
Сделаем функцию, которая принимает в качестве аргументов размер зарплаты сотрудника и количество найденных уязвимостей. Для округления результата используем функцию round( ) , которая округлит прибавку до целого числа.
Summary: in this tutorial, you’ll learn how to show an open file dialog in Tkinter applications.
Как работают вопросительные окна
Чтобы избежать повторений при создании экземпляра кнопки и функции обратного вызова определим метод create_button , который будет переиспользоваться для каждой кнопки с диалогами. Команды всего лишь выводят результат функции dialog , переданной в качестве параметра, что позволит видеть значение, которое она возвращает в зависимости от нажатой пользователем кнопки.
Бинарные файлы
В бинарных файлах данные отображаются в закодированной форме (с использованием только нулей (0) и единиц (1) вместо простых символов). В большинстве случаев это просто последовательности битов.
Они хранятся в формате .bin .
Любую операцию с файлом можно разбить на три крупных этапа:
- Открытие файла
- Выполнение операции (запись, чтение)
- Закрытие файла
Выбор файлов и папок
Диалоговые окна для выбора файлов позволяют выбирать один или несколько файлов из файловой системы. В Tkinter эти функции объявлены в модуле tkinter.filedialog , который также включает окна для выбора папок. Он также позволяет настраивать поведение нового окна: например, фильтрация по расширению или выбор папки по умолчанию.
В этом приложении будет две кнопки. Первая, «Выбрать файл», откроет диалоговое окно для выбора файла. По умолчанию в окне будут только файлы с расширением .txt :
Вторая — «Выбор папки». Она будет открывать похожее диалоговое окно для выбора папки.
Обе кнопки будут выводить полный путь к выбранным файлу или папке и не делать ничего, если пользователь выберет вариант Отмена .
Первая кнопка будет вызывать функцию askopenfilename , а вторая — askdirectory :
Поскольку пользователь может отменить выбор, также добавим условные инструкции, которые перед выводом в консоль будут проверять, не возвращает ли окно пустую строку. Такая валидация нужна для любого приложения, которое в дальнейшем будет работать с вернувшимся путем, считывая и копируя файлы или изменяя разрешения.
Пример
Создадим текстовый файл example.txt и сохраним его в рабочей директории.
Следующий код используется для его открытия.
В этом примере f — переменная-указатель на файл example.txt .
Следующий код используется для вывода содержимого файла и информации о нем.
Стоит обратить внимание, что в Windows стандартной кодировкой является cp1252 , а в Linux — utf-08 .
Чтение и запись файлов в Python
В Python файлы можно читать или записывать информацию в них с помощью соответствующих режимов.
Файлы Python
Файл — это всего лишь набор данных, сохраненный в виде последовательности битов на компьютере. Информация хранится в куче данных (структура данных) и имеет название «имя файла» (filename).
В Python существует два типа файлов:
Introduction to the Tkinter Open File Dialog functions
When developing a Tkinter application that deals with the file system, you need to provide a dialog that allows file selections.
To do that, you can use the tkinter.filedialog module. The following steps show how to display an open file dialog:
First, import the tkinter.filedialog module:
Second, call the fd.askopenfilename() function to show a dialog that allows a single file selection:
The askopenfilename() function returns the file name that you selected.
The askopenfilename() also supports other useful options including the initial directory displayed by the dialog or filtering files by their extensions.
The following program displays a button:
If you click the button, it’ll open a file dialog:
After you select a file, the program will show the full path of the selected file:
Как работают окна выбора файлов и папок
Создадим первое диалоговое окно с помощью функции askopenfilename , которая возвращает строку с полным путем к файлу. Она принимает следующие опциональные аргументы:
- title — название для диалогового окна.
- initialdir — начальная папка.
- filetypes — последовательность из двух строк. Первая — метка с типом файла в читаемом формате, а вторая — шаблон для поиска совпадения с названием файла.
- multiple — булево значение для определения того, может ли пользователь выбирать несколько файлов.
- defaultextension — расширение, добавляемое к файлу, если оно не было указано явно.
В этом примере задаем корневую папку в качестве начальной, а также название. В кортеже типов файлов есть следующие три варианта: текстовые файлы, сохраненные с расширением .txt, изображения с .jpg, .jpg и .jpg, а также подстановочный знак («*») для всех файлов.
Стоит обратить внимание на то, что эти шаблоны не обязательно соответствуют формату данных в файле, поскольку есть возможность переименовать его с другим расширением:
Сегодня мы поработаем с файловой системой ОС — научимся ходить по каталогам, открывать и изменять файлы. Затем освоим могущественные заклинания под названием «регулярные выражения», изучим тонкости создания и вызова функций и под конец напишем простенький сканер SQL-уязвимостей. И все это в одном недлинном уроке!
От редакции
Эта статья — часть цикла «Python с абсолютного нуля», где мы рассказываем об азах Python в нашем фирменном нескучном стиле. Ты можешь читать их по порядку или выбирать какие‑то области, которые хотел бы подтянуть.
- Урок 1: Переменные, типы данных, условия и циклы
- Урок 2: Строки, файлы, исключения и работа с интернетом
Первые два урока доступны целиком без платной подписки. Этот — почти целиком: за исключением последнего примера и домашнего задания.
Закрытие файла
Функция write()
Функция write() используется для записи в файлы Python, открытые в режиме записи.
Если пытаться открыть файл, которого не существует, в этом режиме, тогда будет создан новый.
Синтаксис
Пример
Предположим, файла xyz.txt не существует. Он будет создан при попытке открыть его в режиме чтения.
Функция rename()
Функция rename() используется для переименовывания файлов в Python. Для ее использования сперва нужно импортировать модуль os.
- src = файл, который нужно переименовать
- dest = новое имя файла
Пример
Текущая позиция в файлах Python
В Python возможно узнать текущую позицию в файле с помощью функции tell() . Таким же образом можно изменить текущую позицию командой seek() .
I would like to get file path as input in my Python console application.
Currently I can only ask for full path as an input in the console.
Is there a way to trigger a simple user interface where users can select file instead of typing the full path?
Функция read()
Функция read() используется для чтения содержимого файла после открытия его в режиме чтения ( r ).
Синтаксис
- file = объект файла
- size = количество символов, которые нужно прочитать. Если не указать, то файл прочитается целиком.
Пример
Opening files directly
After getting the selected file names, you can open them using the open() method.
To make it more convenient, the tkinter.filedialog module also provides some functions that allow you to select one or more files and return the file objects directly.
The askopenfile() function displays a file dialog and returns a file object of the selected file:
And the askopenfiles() function shows a file dialog and returns file objects of the selected files:
The following program illustrates how to use the askopenfile() function:
It’ll allow you to open a text file and display the file content on a Text widget:
Открытие файла
Функция readline()
Функция readline() используется для построчного чтения содержимого файла. Она используется для крупных файлов. С ее помощью можно получать доступ к любой строке в любой момент.
Пример
Создадим файл test.txt с нескольким строками:
Посмотрим, как функция readline() работает в test.txt .
Обратите внимание, как в последнем случае строки отделены друг от друга.
Переименование файлов в Python
Метод open()
В Python есть встроенная функция open() . С ее помощью можно открыть любой файл на компьютере. Технически Python создает на его основе объект.
- file_name = имя открываемого файла
- access_mode = режим открытия файла. Он может быть: для чтения, записи и т. д. По умолчанию используется режим чтения ( r ), если другое не указано. Далее полный список режимов открытия файла
Читайте также: