Create File in Python
In this tutorial, you’ll learn how to create a file in Python.
Python is widely used in data analytics and comes with some inbuilt functions to work with files. We can create a file and do different operations, such as write a file and read a file using Python.
After reading this tutorial, you’ll learn: –
- Create a file in the current directory or a specified directory
- Create a file if not exists
- Create a file with a date and time as its name
- Create a file with permissions
Table of contents
Create A Empty Text File
We don’t have to import any module to create a new file. We can create a file using the built-in function open() .
Pass the file name and access mode to the open() function to create a file. Access mode specifies the purpose of opening a file.
Below is the list of access modes for creating an a file.
File Mode | Meaning |
---|---|
w | Create a new file for writing. If a file already exists, it truncates the file first. Use to create and write content into a new file. |
x | Open a file only for exclusive creation. If the file already exists, this operation fails. |
a | Open a file in the append mode and add new content at the end of the file. |
b | Create a binary file |
t | Create and open a file in a text mode |
File access mode
Example: Create a new empty text file named ‘sales.txt’
Use access mode w if you want to create and write content into a file.
As you can see in the image two new files gets created in the account folder.
created files
Note:
- The file is created in the same directory where our program/script is running.
- If you have not specified any specific path(directory location), the file is created in the working directory. It is known as creating a file using the relative path. A relative path contains the current directory and then the file name.
You can verify the result using the following four approaches
- If the script executed without an error or exception
- By checking the working directory manually to look for a new file
- Use the os.listdir(directory_path) function to list all files from a folder before and after creating a file
- Use the os.path.isfile(file_path) function to verify if a newly created file exists in a directory.
Let’s verify our operation result.
Output
Create File In A Specific Directory
To create a file inside a specific directory, we need to open a file using the absolute path. An absolute path contains the entire path to the file or directory that we need to use.
It includes the complete directory list required to locate the file. For example, /user/Pynative/data/sales.txt is an absolute path to discover the sales.txt . All of the information needed to find the file is contained in the path string.
Let’s see the example to create a file for writing using the absolute path.
Note: Using the with statement a file is closed automatically it ensures that all the resources that are tied up with the file are released.
Let’s verify result using the absolute path.
Also, you can join directory path and file name to create file at the specified location.
If you have a directory path and file name in two variables, use the os.path.join() function to construct a full path. This function accepts the directory path and file name as arguments and constructs an absolute path to create a file.
Example:
Create a File If Not Exists
Sometimes it is essential not to create a new file if a file with the same name already exists in a given path. By default, when you open a file in write mode, it overwrites it if it exists. Else, create the new one.
We can create a file only if it is not present using the following two ways:
- Use os.path.exists(«file_path») function to check if a file exists.
- Use the access mode x in the open() function and exception handling.
Example 1: create file if not exists.
Example 2: Use file access mode x
The access mode x open a file for exclusive creation. If the file already exists, this operation fails with FileExistsError . Use try-except block to handle this error.
Create File with a DateTime
Let’s see how to create a text file with the current date as its name. Use the datetime module to get the current date and time and assign it to the file name to create a file with the date and time in its name.
- Python provides a datetime module that has several classes to access and manipulate the date and timestamp value.
- First, get the current datetime value
- Next, we need to format datetime into a string to use it as a file name.
- At last, pass it to the open() function to create a file
Example
Output:
Create a file with Permission
Let’s see how to create a file with permissions other users can write.
- To create a file with appropriate permissions, use os.open() to create the file descriptor and set the permission.
- Next, open the descriptor using the built-in function open()
Did you find this page helpful? Let others know about it. Sharing helps me continue to create free Python resources.
About Vishal
Founder of PYnative.com I am a Python developer and I love to write articles to help developers. Follow me on Twitter. All the best for your future Python endeavors!
Related Tutorial Topics:
Python Exercises and Quizzes
Free coding exercises and quizzes cover Python basics, data structure, data analytics, and more.
Чтение данных из файла и запись в файл
В Python, чтобы создать файл, надо его открыть в режиме записи (‘w’, ‘wb’) или дозаписи (‘a’, ‘ab’).
Функция open() возвращает файловый объект.
Без ‘b’ создается текстовый файл, представляющий собой поток символов. С ‘b’ — файл, содержащий поток байтов.
В Python также существует режим ‘x’ или ‘xb’. В этом режиме проверяется, есть ли файл. Если файл с определенным именем уже существует, он не будет создан. В режиме ‘w’ файл создается заново, старый при этом теряется.
Чтение данных из файла
Если в функцию open() не передается второй аргумент, файл расценивается как текстовый и открывается на чтение.
Попытка открыть на чтение несуществующий файл вызывает ошибку.
Перехватить возникшее исключение можно с помощью конструкции try-except.
Получить все данные из файла можно с помощью метода read() файлового объекта, предварительно открыв файл на чтение. При этом файловый объект изменяется и получить из него данные еще раз не получится.
Методу read() может быть передан один аргумент, обозначающий количество байт для чтения.
Метод readline() позволяет получать данные построчно.
Принимает аргумент — число байт.
Метод readlines() считывает все строки и помещает их в список.
Может принимать количество байт, но дочитывает строку до конца.
Запись данных в файл
Записать данные в файл можно с помощью метода write(), который возвращает число записанных символов.
Файл, открытый на запись, нельзя прочитать. Для этого требуется его закрыть, а потом открыть на чтение.
С помощью метода writelines() можно записать в файл итерируемую последовательность.
Смена позиции в файле
Двоичные файлы
Пример копирования изображения:
Модуль struct позволяет преобразовывать данные к бинарному виду и обратно.
9. Модули и файлы¶
Модуль — это файл, содержащий код на языке Python и предназначенный для использования другими программами на Python. В составе стандартной библиотеки есть много модулей. Два из них, doctest и string , уже нам знакомы.
9.2. pydoc¶
Команда pydoc позволяет строить и просматривать документацию по библиотекам Python, установленным на вашем компьютере. В командной строке операционной системы введите:
Если вы работаете в Windows и в ответ на введенную команду получили сообщение о том, что файл не найден, попробуйте запустить pydoc , указав полный путь к нему. Скрипт pydoc находится в поддиректории lib директории, в которой установлен Python. Например, если Python установлен в C:\Python27, то полный путь к pydoc будет C:\Python27\lib\pydoc.py.
Запустив pydoc с ключом -g вы увидите следующее:
(См. упражнение 2, если возникла ошибка.)
Нажмите на кнопку ‘open browser’ для открытия окна браузера с документацией, сгенерированной pydoc :
Вы видите перечень всех библиотек Python, которые интерпретатор Python нашел на вашем компьютере. Щелкнув мышкой по имени модуля, вы получите страницу с документацией для этого модуля. Например, щелчок по keyword открывает следующую страницу:
Документация для большинства модулей содержит три раздела, выделенных разными цветами:
- Классы — розовым,
- Функции — оранжевым,
- Данные — зеленым.
Классы мы обсудим в других главах, а пока будем использовать pydoc, чтобы смотреть функции и данные, содержащиеся в модулях.
Модуль keyword содержит единственную функцию iskeyword , которая, как видно из ее имени, возвращает True , если переданная ей строка является ключевым словом:
Список kwlist содержит все ключевые слова Python:
Исследуйте с помощью pydoc библиотеки Python. Там столько настоящих сокровищ!
9.3. Создание модулей¶
Все, что нужно для создания модуля — это текстовый файл, имя которого имеет расширение .py :
Этот модуль можно использовать как в скриптах, так и в интерактивном режиме Python. Для этого вначале нужно импортировать модуль. Есть два способа сделать это. Первый:
В первом примере remove_at вызывается точно так же, как и функции, которые мы вызывали раньше. Во втором примере, имени функции предшествуют имя модуля и точка.
Заметьте, что ни в первом, ни во втором случае мы не указываем расширение файла .py , когда импортируем модуль. Python ожидает, что имена файлов модулей Python имеют расширение .py , так что оно не включается в предложение import.
Использование модулей позволяет разбивать очень большие программы на относительно небольшие части, с которыми удобно работать. При этом в каждый модуль помещается код, имеющий тесные связи, а связи между модулями стараются свести к минимуму.
9.4. Пространства имен¶
Пространство имен представляет собой синтаксический контейнер, который позволяет использовать одно и то же имя в разных модулях или функциях (а также, как мы скоро увидим, в классах и методах).
Каждый модуль определяет свое собственное пространство имен. Поэтому одно и то же имя можно использовать в разных модулях, не вызывая конфликта:
Можно импортировать оба модуля и поработать с question и answer в каждом из них:
Но если бы мы использовали предложения from module1 import * и from module2 import * , то получили бы конфликт имен и не смогли бы добраться до question и answer из модуля module1 .
Функции также определяют свои собственные пространства имен:
Эта программа выведет следующее:
Три переменных n здесь не конфликтуют друг с другом, поскольку каждая находится в своем пространстве имен.
Пространства имен позволяют нескольким программистам работать над одним проектом, избегая конфликтов имен.
9.5. Атрибуты и оператор точка¶
Переменные, определенные внутри модуля, называются атрибутами модуля. Для доступа к ним используется оператор точка . . Одноименные атрибуты question модулей module1 и module2 записываются как module1.question и module2.question .
Модули содержат не только переменные, но и функции, и обращение к ним также записывается с помощью оператора точка. seqtools.remove_at указывает на функцию remove_at в модуле seqtools .
Ранее мы познакомились с функцией find из модуля string . Модуль string содержит много других полезных функций:
Просмотрите документацию по другим функциям и переменным модуля string с помощью pydoc.
9.6. Строковые и списочные методы¶
Чем дальше развивался язык Python, тем больше функций из модуля string реализовывались как методы строковых объектов. Метод работает как функция, но вызывается немного по-другому:
Строковые методы встроены в строковые объекты и вызываются с помощью точки и имени метода после имени объекта.
В последующих главах мы научимся создавать наши собственные объекты с методами. А пока будем использовать методы встроенных объектов Python.
Аналогично вызываются методы списочного объекта:
Метод append добавляет переданный ему аргумент в конец списка. Попробуем еще несколько списочных методов:
Поэкспериментируйте с методами из этого примера, пока не почувствуете, что понимаете, как они работают.
9.7. Чтение и запись текстовых файлов¶
Во время выполнения программы ее данные хранятся в оперативной памяти компьютера. Оперативная память быстрая и недорогая, однако она непостоянна. Это значит, что после завершения программы или выключения компьютера данные исчезают. Чтобы данные не исчезали и были доступны в следующий раз, когда вы включите компьютер и запустите программу, нужно записать их на носитель данных с постоянной памятью, такой, как жесткий диск, флешка или CD-RW.
Данные на носителе хранятся в файлах — именованных участках памяти носителя. Читая и записывая файлы, программы могут сохранять информацию между запусками.
Работа с файлами похожа на работу с записной книжкой. Для того, чтобы воспользоваться записной книжкой, вам нужно ее открыть. Когда вы закончили, то закрываете ее. Пока записная книжка открыта, можно как писать в нее, так и читать, и вы всегда знаете, в каком месте записной книжки вы находитесь. Вы можете прочитать записную книжку от начала до конца в естественном порядке, или можете перепрыгивать со страницы на страницу.
Все это применимо к файлам. Чтобы открыть файл, вы указываете его имя и то, хотите ли вы читать или писать.
Открытие файла создает файловый объект. В следующем примере переменная myfile связывается с новым файловым объектом.
Функция open принимает два аргумента. Первый — имя файла, второй — режим работы с файлом. Режим 'w' (англ.: write — писать) означает, что файл открывается для записи.
Если файла с именем test.dat не существует, он будет создан. Если такой файл уже есть, его содержимое будет заменено на то, что мы будем писать в него.
Когда мы выводим файловый объект с помощью print, то видим имя файла и режим.
Данные помещаются в файл с помощью метода write файлового объекта:
Закрытие файла сообщает системе о том, что мы закончили писать в файл, и делает файл доступным для чтения:
Теперь мы можем снова открыть файл, на этот раз для чтения, и прочитать содержимое файла в строку. На этот раз, аргумент mode будет 'r' (англ.: read — читать):
Если мы попробуем открыть несуществующий файл, то получим ошибку:
Для чтения из файла предназначен метод read . Вызванный без аргументов, он читает все содержимое файла и помещает его в один строковый объект:
Между ‘time’ и ‘to’ нет пробела, так как мы не записали пробел.
Метод read может принимать аргумент, показывающий, сколько символов нужно прочитать из файла:
Если в файле осталось меньше символов, чем задано для чтения, read прочитает все, что осталось. Когда будет достигнут конец файла, read вернет пустую строку:
Следующая функция копирует файл, прочитывая и записывая по 50 символов за раз. Ее первый параметр — имя оригинального файла, второй — имя нового файла:
В этой функции в цикле читаются 50 символов из infile и записываются в outfile до тех пор, пока не будет достигнут конец файла infile . По достижении конца файла значением text будет пустая строка и выполнится break .
9.8. Текстовые файлы¶
Текстовый файл — это файл, содержащий только печатные и пробельные символы, организованные в строки, разделенные символом перевода строки. Поскольку Python был спроектирован специально для обработки текстовых файлов, он предоставляет отличные средства для такой работы.
Создадим файл с тремя строками текста, разделенными переводом строки:
Метод readline читает все символы до символа перевода строки, включительно:
Метод readlines читает все оставшиеся строки из файла и помещает их в список строк:
В данном случае вывод делается в списочном формате, вот почему строковые значения заключены в кавычки и символы перевода строки представлены в виде управляющих последовательностей \\012 .
Если достигнут конец файла, то readline вернет пустую строку, а readlines — пустой список:
Приведем пример программы для обработки строк. Функция filter делает копию файла oldfile , исключая строки, которые начинаются с # :
Предложение continue завершает текущую итерацию цикла, но цикл продолжает выполняться. Поток выполнения продолжится с заголовка цикла, то есть, будет проверено условие и далее выполнение продолжится в соответствии с результатом проверки.
Таким образом, если text будет пустой строкой, то цикл завершится. Если первый символ text будет решетка, то выполнение перейдет к заголовку цикла. И только если оба эти условия не выполнятся, text будет записан в новый файл.
9.9. Каталоги¶
Многочисленные файлы для хранения в постоянной памяти организуются по правилам, известным как файловая система. Файловые системы имеют дело с файлами и каталогами. Последние могут содержать файлы и другие каталоги. (Иногда каталоги называют директориями.)
Когда ваш скрипт создает новый файл, этот файл создается в текущем каталоге — в том, в котором вы находились, когда запустили скрипт. Также, когда скрипт открывает файл для чтения, Python ищет его в текущем каталоге.
Если вы хотите открыть файл из другого каталога, вам придется указать путь к файлу, который содержит как имя каталога, так и имя файла:
В этом примере открывается файл words , находящийся в каталоге dict , находящемся в share , находящемся в usr , находящемся в каталоге верхнего уровня / . Затем программа читает строки файла в список с помощью readlines , и выводит первые 5 элементов списка.
Нельзя использовать символ / как часть имени файла; он зарезервирован для разделения имен каталогов и файла.
Файл /usr/share/dict/words существует в системах, основанных на Unix, и содержит список слов в алфавитном порядке.
9.10. Считаем буквы¶
Функция ord возвращает целочисленный код символа:
Этот пример объясняет, почему выражение 'Apple' < 'apple' дает True .
Функция chr противоположна функции ord . Она принимает целочисленный аргумент и возвращает его символьное представление:
Следующая программа, countletters.py , подсчитывает, сколько раз встречается каждая буква в книге Алиса в стране чудес:
Запустите эту программу и посмотрите созданный ей файл с помощью текстового редактора. В упражнении ниже вам нужно будет проанализировать эту программу.
9.11. Модуль sys и argv ¶
Модуль sys содержит функции и переменные для доступа к среде, в которой выполняется интерпретатор Python.
Следующий пример показывает значения некоторых из этих переменных на компьютере c Linux:
На компьютере с Windows можем увидеть такую картину:
На вашей машине результаты, конечно, будут отличаться.
Переменная argv содержит список аргументов, считанных из командной строки, которой был запущен скрипт. Аргументы командной строки можно использовать для передачи информации в программу во время ее запуска.
Запуск этой программы в командной строке Unix демонстрирует, как работает sys.argv :
argv есть список строковых объектов. Заметьте, что первый элемент списка — имя файла программы. Аргументы, разделенные пробелами в командной строке, попадают в список, как будто обработанные методом string.split . Если вы хотите передать аргумент, содержащий пробел, заключите аргумент в кавычки:
Пользуясь argv , можно писать полезные программы, которые получают ввод прямо из командной строки. Например, вот программа, которая подсчитывает сумму последовательности чисел:
В этой программе мы воспользовались способом импорта from <module> import <attribute> , поэтому имя argv оказалось в пространстве имен программы.
Теперь можно запускать программу в командной строке так:
В качестве упражнения вам полезно будет написать собственные программы, похожие на эту.
9.12. Глоссарий¶
Предложение, которое делает содержащиеся в модуле объекты доступными для использования в программе. Имеются две формы предложения import.
Следующий пример для гипотетического модуля mymod , содержащего функции f1 и f2 , а также переменные v1 и v2 , иллюстрирует использование обеих форм:
Это первая форма.
Импорт перечисленных объектов.
pydoc Генератор документации Python. аргумент командной строки Значение, передаваемое в программу при ее запуске из командной строки. атрибут Переменная или функция, определенная внутри модуля (или класса или объекта — как мы увидим далее). Атрибуты модуля доступны с помощью оператора точка . . каталог Элемент файловой системы, иногда называемый директорией и даже папкой. Каталог может содержать файлы и другие каталоги, являющиеся его подкаталогами. командная строка Строка, считываемая интерфейсом командной строки для выполнения интерпретатором команд. конфликт имен
Ситуация, когда два или более объекта получают одинаковые имена в одном и том же пространстве имен. Использование
предотвращает конфликты имен.
Атрибут функционального типа у класса или объекта. Методы вызываются для объекта с помощью оператора точка. Например:
В таком случае говорят, что метод upper вызван для строки s . s неявно является первым аргументом для upper .
модуль Файл, содержащий предложения Python и предназначенный для использования другими программами Python. Содержимое модуля делается доступным в другой программе с помощью предложения import . непостоянная память Память, которая нуждается в электропитании для того, чтобы сохранять состояние. Оперативная память компьютера является непостоянной. Данные, хранящиеся в оперативной памяти, теряются при выключении компьютера. оператор точка Оператор точка . разрешает доступ к атрибутам модуля (или атрибутам класса или объекта — как мы увидим далее). постоянная память Память, которая сохраняет состояние в отсутствии электропитания. Жесткие диски, флэшки, компакт диски — примеры устройств с постоянной памятью. приглашение Текст, отображаемый интерфейсом командной строки, показывающий, что можно вводить команду. пространство имен Синтаксический контейнер, предоставляющий контекст для имен, так, что одно и то же имя может использоваться в разных пространствах имен, не приводя к неоднозначности. В Python модулям, классам, функциям и методам соответствуют собственные пространства имен. путь Последовательность имен каталогов и имя файла, задающая местонахождение файла в файловой системе. Например, путь /usr/share/dict/words задает файл words , находящийся в подкаталоге dict подкаталога share подкаталога usr каталога / . разделитель Последовательность из одного и более символов, использующаяся для разделения частей текста. режим Определенный способ работы компьютерной программы. Файлы в Python могут открываться в одном из трех режимов: читать (‘r’), писать (‘w’) и добавлять (‘a’). стандартная библиотека Библиотека — это коллекция программ, использующихся при разработке других программ. Стандартная библиотека языка программирования распространяется и устанавливается на компьютер вместе с языком программирования. Python предоставляет обширную стандартную библиотеку. текстовый файл Файл, содержащий печатные и пробельные символы, которые организованы в строки, ограниченные символами новой строки. файл Именованный участок памяти таких устройств, как жесткий диск, гибкий диск, флэшка или CD-ROM, который содержит последовательность символов. файловая система Набор правил для организации хранения файлов и данных, в них содержащихся.
9.13. Упражнения¶
Запустите сервер pydoc командой pydoc -g в командной строке.
Нажмите кнопку ‘open browser’ в окошке pydoc.
Найдите модуль calendar и щелкните мышкой на нем.
Просматривая раздел Functions, попробуйте выполнить следующее в режиме интерпретатора Python:
Поэкспериментируйте с calendar.isleap . Что ожидает эта функция в качестве аргумента? Что она возвращает в качестве результата? Какого типа эта функция?
Повторите, что вы узнали из этого упражнения.
Если на вашем компьютере не установлен Tkinter , то pydoc -g вернет сообщение об ошибке, поскольку графическое окно рисуется с помощью Tkinter . Вместо этого, можно запустить web-сервер непосредственно:
Эта команда запускает сервер pydoc с портом 7464. Теперь задайте в вашем браузере адрес:
и вы сможете просматривать документацию по библиотекам Python.
Таким способом запустите pydoc и посмотрите документацию по модулю math .
- Сколько функций в модуле math ?
- Что делает math.ceil ? А что делает math.floor ? И floor и ceil принимают значение с плавающей точкой в качестве аргумента.
- Как можно вычислить то же самое значение, что возвращает math.sqrt , не используя модуль math ?
- Какие две константы имеются в модуле math ?
Исследуйте модуль copy с помощью pydoc . Что делает deepcopy ? В каких упражнениях из предыдущей главы deepcopy пришлась бы кстати?
Создайте модуль mymodule1.py . Добавьте атрибуты myage с вашим возрастом и year с текущим годом. Создайте еще один модуль mymodule2.py . Добавьте атрибуты myage , равный 0, и year с годом вашего рождения. Теперь создайте файл namespace_test.py . Импортируйте в него оба модуля и напишите следующее предложение:
При выполнении namespace_test.py вы увидите True или False , в зависимости от того, был ли уже ваш день рождения в этом году.
Добавьте следующее предложение к mymodule1.py , mymodule2.py и namespace_test.py из предыдущего упражнения:
Выполните namespace_test.py . Что произошло? Почему? Теперь добавьте следующее в конец файла mymodule1.py :
Выполните mymodule1.py и namespace_test.py снова. В каком случае вы видите вывод нового предложения print?
В режиме интерпретатора Python выполните:
Что говорит Тим Петерс о пространствах имен?
Используя pydoc найдите и исследуйте еще три функции из модуля string .
Перепишите matrix_mult из предыдущей главы, воспользовавшись списочными методами.
Функция dir , с которой мы уже встречались, выводит список атрибутов объекта, переданного ей в качестве аргумента. Другими словами, dir возвращает содержимое пространства имен своего аргумента. С помощью dir(str) и dir(list) найдите, по крайней мере, три метода, с которыми мы до сих пор не познакомились.
Чтобы узнать побольше о заинтересовавшей вас функции, выведите ее документирующую строку. Например, для того, чтобы выяснить, как работает str.join , выполните print str.join.__doc__ .
Что получится, если выполнить следующие предложения в интерактивном режиме Python:
10 самых продуктивных техник для работы с файлами в Python
Какой бы проект вы ни разрабатывали, вам не избежать работы с файлами либо на компьютере, либо на сервере. И неудивительно, поскольку они являются самыми распространёнными контейнерами для хранения взаимосвязанной и обычно структурированной информации. При этом многим приходится выискивать конкретные операции, связанные с обработкой файлов. Поэтому мы решили посвятить данную статью 10 наиболее эффективным техникам для работы с файлами в Python.
1. Показ текущей директории
Чтобы узнать текущую рабочую директорию, мы можем просто ввести функцию getcwd() модуля os, как показано ниже:
Данный код также демонстрирует возможность использования модуля pathlib для получения текущей рабочей директории. Обратите внимание, что для выполнения операций с файлами именно этот модуль является предпочтительным вариантом, и в статье вас ждёт немало примеров его употребления. Однако, если у вас устаревшая версия Python (< 3.4), то вам придётся использовать модуль os .
2. Создание новой директории
Для создания новой директории можно применить функцию mkdir() , которая выполнит эту операцию по конкретно заданному пути. Если вы просто укажете имя новой директории, то она будет создана в текущем каталоге:
Однако, если вы намерены создать новую директорию с несколькими вложенными уровнями (имеется в виду наличие одной папки внутри другой), то вам необходимо использовать функцию makedirs() . Обратимся к простому примеру:
Если же у вас последние версии Python (≥ 3.4), то для решения вышеуказанной задачи можно воспользоваться преимуществом модуля pathlib . При этом он способен не только создавать поддиректории, но также при необходимости работать с каталогами, отсутствующими в пути. Рассмотрим пример:
Имейте в виду, что попытка повторного выполнения вышеприведённого кода может вызвать проблемы — вы не сможете создать новую директорию, если такая уже существует. Стоит отметить, что эта проблема решается путём присвоения аргументу exist_ok значения True , как показано выше. А вот значение False , установленное для него по умолчанию, не позволит повторно создать уже существующую директорию и приведёт к ошибке.
3. Удаление директорий и файлов
По завершении операций с файлами или папками, возможно, потребуется их удалить, чтобы упорядочить ресурсы компьютера. Для удаления файла в модуле os применяется функция remove() , а для удаления папки — функция rmdir() . Попытка же удалить директорию с помощью remove() вызовет ошибку. Рассмотрим применение этих функций:
При использовании модуля pathlib за удаление файла отвечает метод unlink() , а за удаление директории — rmdir() . Обратите внимание, что они оба являются методами экземпляра объекта Path .
4. Получение списка файлов
В процессе обработки данных для аналитики или проектов МО вам потребуется получить список файлов в определённой директории. Зачастую их имена соответствуют определённому шаблону. Допустим, мы хотим найти все файлы .txt в директории. Далее рассмотрим, как это можно сделать с помощью метода glob() с объектом Path . Обратите внимание, что данный метод создаёт генератор с возможностью итерации. Следующий код наглядно демонстрирует создание генератором списка путей файлов:
Как вариант, также удобно использовать модуль glob напрямую, как показано ниже. Он располагает аналогичной функциональностью, создавая списки имён файлов, с которыми впоследствии можно работать. Заметьте, что Path.glob() создаёт пути. Оба метода будут работать в большинстве сценариев, таких как чтение и запись файлов.
5. Перемещение и копирование файлов
Перемещение и копирование — одна из стандартных задач управления файлами, которая довольно легко решается в Python. Для перемещения вы просто переименовываете файл, заменяя его старую директорию целевой. Предположим, необходимо переместить все файлы .txt в другую папку. В следующем примере кода мы увидим, как это можно сделать с помощью модуля pathlib:
Копирование же можно выполнить при помощи функциональности, доступной в shutil, ещё одном полезном модуле из стандартной библиотеки для операций с файлами. Здесь за это отвечает функция copy() , в которой исходный и целевой файлы указываются в виде строк. Ниже вы увидите простой пример. Конечно, вы можете объединить функции copy() и glob() для работы с группой файлов, соответствующих одному паттерну.
6. Проверка директории/файла
На самом деле, эта операция уже много раз встречалась в вышеприведённых примерах. В них для проверки того, существует ли конкретный путь, применялся метод exists() . При условии положительного ответа он возвращает True , в противном случае — False . Примечательно, что эта функция доступна в обоих модулях, os и pathlib, но с разными сигнатурами. Рассмотрим соответствующие примеры их применения:
В модуле pathlib можно также проверить, является ли путь директорией или файлом с готовыми к вызову функциями. Обратимся к следующему примеру:
7. Получение информации о файле
При работе с файлами во многих сценариях возникает необходимость извлечения их имён. С объектом Path это просто как дважды два, и вы уже были свидетелями его применения. Можно просто извлечь атрибут name файлового объекта Path . Если же вам нужно узнать только имя без расширения, то извлекать следует атрибут stem . Следующий фрагмент кода демонстрирует соответствующие случаи применения:
В отдельных случаях вам потребуется узнать расширение файла, с которым вы работаете. Чаще всего можно воспользоваться атрибутом suffix файлового объекта Path , как показано ниже:
Если необходимо получить больше информации о файле, например, его размер и время изменения, то для этого в нашем распоряжении есть метод stat() , принцип действия которого аналогичен os.stat() , знакомого тем, кто привык работать с модулем os.
8. Чтение файлов
Одна из важнейших операций с файлами — считывание их данных. В конце концов, содержимое файла является, вероятно, единственной причиной его появления. Самый традиционный способ состоит в создании файлового объекта с помощью встроенной функции open() . По умолчанию она откроет файл в режиме чтения и будет работать с его данными как с текстом. Рассмотрим пример:
Этот код демонстрирует самые распространённые способы чтения содержимого. Если вы знаете, что ваш файл включает немного данных, можете считать их все за раз с помощью метода read() . Но если он очень крупный, то следует рассмотреть вариант с генератором, роль которого выполняет файловый объект. Он обрабатывает данные построчно и тем самым экономно расходует память, обходясь без загрузки всех данных при применении read() .
Как уже ранее упоминалось, функция open() по умолчанию работает с содержимым файла как с текстом. Однако в случае с бинарными файлами необходимо явно задать данное условие. Например, вместо ‘r’ следует ввести ‘rb’ . Это требование также относится и к записи файлов, о чём мы поговорим далее. Ещё один непростой момент связан с кодировкой файла. Во многих случаях функция open() сможет выполнить эту операцию за нас, и большинство файлов, с которыми мы работаем, будут в кодировке “utf-8”. Если же вы обрабатываете файлы, применяя другие форматы кодировки, вам следует установить аргумент encoding .
9. Запись файлов
Для записи данных можно опять же создать файловый объект, открыв файл в режиме записи ( ‘w’ ) или дозаписи ( ‘a’ ). В первом случае при записи данных в файл его старое содержимое удаляется, а во втором — данные добавляются в конец файла. Рассмотрим пример работы этих двух режимов в следующем фрагменте кода.
Этот код подтверждает, что мы можем записывать данные в двух режимах: записи и дозаписи. Обратили вы внимание или нет, но каждый раз при открытии файла использовалась инструкция with . Объясняется это тем, что она создаёт контекст для обработки файла и помогает закрыть файловый объект по завершении операций. Если же вовремя этого не сделать, то открытый файловый объект может повредиться.
10. Архивирование и разархивирование файлов
При работе с большим числом файлов может потребоваться их архивирование для долгосрочного хранения или временной передачи. Соответствующие возможности предоставляются модулем zipfile. Для архивирования файлов функцией ZipFile() создаётся файловый объект zip, что напоминает случай с функцией open() , поскольку обе эти функции предусматривают создание файлового объекта, управляемого контекстным менеджером (вспоминаете применение инструкции with ?). Обратимся к фрагменту кода с простым примером:
Вы можете получить zip-файл из внешнего источника, и вам потребуется извлечь из него файлы. Чтобы не усложнять, допустим, что мы распаковываем их в текущую директорию. Обратите внимание на то, что имена файлов в zip-файле совпадают с содержащимися в директории, вследствие чего последние будут перезаписаны без предупреждения. Поэтому вам следует рассмотреть вариант извлечения содержимого zip-файла в отдельную папку, где такой проблемы перезаписи не возникнет.
Заключение
Итак, в данной статье мы рассмотрели 10 наиболее полезных операций по работе с файлами. Как вы могли убедиться, все они укладываются в несколько строк кода, поэтому не представляют абсолютно никакой сложности. Если вы с ними не знакомы, то надеемся, что эта статья послужит для вас кратким руководством в процессе работы с файлами.