Python становится все популярнее благодаря относительной простоте изучения, универсальности и другим преимуществам. Правда, у начинающих разработчиков нередко возникают проблемы при работе с файлами и файловой системой. Просто потому, что они знают не все команды, которые нужно знать.
Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).
Показать текущий каталог
Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.
Относительный путь хорош тем, что работает для всех пользователей, с любыми системами, количеством дисков и так далее.
Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:
import os
os.getcwd()
Ее легко запомнить, так что лучше выучить один раз, чем постоянно гуглить. Это здорово экономит время.
Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.
Проверяем, существует файл или каталог
Прежде чем задействовать команду по созданию файла или каталога, стоит убедиться, что аналогичных элементов нет. Это поможет избежать ряда ошибок при работе приложения, включая перезапись существующих элементов с данными.
Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.
В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:
os.path.exists('sample_data')
Эта же команда подходит и для работы с файлами:
os.path.exists(‘sample_data/README.md’)
Если папки или файла нет, команда возвращает false.
Объединение компонентов пути
В предыдущем примере я намеренно использовал слеш «/» для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш «\» в качестве разделителя.
Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:
os.path.exists(os.path.join('sample_data', 'README.md'))
Создание директории
Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():
os.mkdir('test_dir')
Давайте посмотрим, как это работает на практике.
Если же мы попытаемся создать каталог, который уже существует, то получим исключение.
Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:
if not os.path.exists('test_dir'):
os.mkdir('test_dir')
Еще один совет по созданию каталогов. Иногда нам нужно создать подкаталоги с уровнем вложенности 2 или более. Если мы все еще используем os.mkdir (), нам нужно будет сделать это несколько раз. В этом случае мы можем использовать os.makedirs (). Эта функция создаст все промежуточные каталоги так же, как флаг mkdir -p в системе Linux:
os.makedirs(os.path.join('test_dir', 'level_1', 'level_2', 'level_3'))
Вот что получается в результате.
Показываем содержимое директории
Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.
Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:
os.listdir('sample_data')
В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:
from glob import globlist(glob(os.path.join('sample_data', '*.csv')))
Перемещение файлов
Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:
import shutilfor file in list(glob(os.path.join('sample_data', '*.csv'))):
shutil.move(file, 'test_dir')
Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.
Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.
Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:
for file in list(glob(os.path.join('test_dir', '*.csv'))):
os.rename(
file,
os.path.join(
'sample_data',
os.path.basename(file)
))
Здесь функция os.path.basename () предназначена для извлечения имени файла из пути с любым количеством компонентов.
Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.
Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.
Поэтому я рекомендую использовать shutil.move () для перемещения файлов.
Копирование файлов
Аналогичным образом shutil подходит и для копирования файлов по уже упомянутым причинам.
Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():
shutil.copy(
os.path.join('sample_data', 'README.md'),
os.path.join('test_dir')
)
Удаление файлов и папок
Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.
Когда нужно удалить файл, нужно воспользоваться командой os.remove():
os.remove(os.path.join('test_dir', 'README(1).md'))
Если требуется удалить каталог, на помощь приходит os.rmdir():
os.rmdir(os.path.join('test_dir', 'level_1', 'level_2', 'level_3'))
Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.
Функция shutil.rmtree() сделает все, что нужно:
shutil.rmtree(os.path.join('test_dir', 'level_1'))
Пользоваться ею нужно с осторожностью, поскольку она безвозвратно удаляет все содержимое каталога.
Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.
Last Updated :
14 Dec, 2023
When any large program is created, usually there are small files that we need to create to store some data that is needed for the large programs. when our program is completed, so we need to delete them. In this article, we will see how to delete a file in Python.
Methods to Delete a File in Python
- Python Delete File using os. remove
- Delete file in Python using the send2trash module
- Python Delete File using os.rmdir
Check if the file exists or not
Command to install OS Module:
pip3 install os
For Delete a File in Python, you can use the os.path.exists()
function to check if a file exists. Here’s a simple example: Replace '
path/to/your/file.txt
'
with the actual path of the file you want to check. The os.path.exists()
function returns True
if the file exists and False
otherwise. The code then prints a message based on the existence of the file.
Python3
import
os
def
check_file_existence(file_path):
if
os.path.exists(file_path):
print
(f
'The file "{file_path}" exists.'
)
else
:
print
(f
'The file "{file_path}" does not exist.'
)
file_path
=
'path/to/your/file.txt'
check_file_existence(file_path)
Output :
The file "path/to/your/file.txt" does not exist.
Delete a File in Python using ‘os.remove’
We will be importing the OS library and going to use the os.remove() function to remove the desired file.
Example 1: Delete the file from your current directory
This is the simple code to delete the file from your current directory.
Python3
import
os
os.remove(
"starwars.txt"
)
Example 2: Detailed Explanation
In below code Python script prompts the user to input a filename for deletion. If the input is ‘quit’, the program exits; otherwise, it attempts to remove the specified file using `os.remove()`. A success message is then printed.
Python3
import
os
print
(
"Enter 'quit' for exiting the program"
)
filename
=
input
('Enter the name of the
file
, \
that
is
to be deleted : ')
if
filename
=
=
'quit'
:
exit()
else
:
print
(
'\nStarting the removal of the file !'
)
os.remove(filename)
print
(
'\nFile, '
, filename, 'The
file
deletion \
is
successfully completed !!')
Output:
The desired file to be deleted:
A sample run of the program
When we enter the name of the file to be deleted:
The deletion:
The Working Output:
Delete a Files in Python using send2trash Module
We can use the os.walk() function to walk through a directory and delete specific files. In the example below, we will delete all ‘.txt’ files in the given directory.
Example : In this script walks through files in the directory ‘/Users/tithighosh/Documents’ using `os.walk`. For each ‘.txt’ file found, it prints its path and uses `send2trash` to move it to the system trash, avoiding permanent deletion. The script effectively trashes all ‘.txt’ files in the specified directory and its subdirectories.
Python3
import
os
import
send2trash
for
folder, subfolders, files
in
os.walk(
'/Users/tithighosh/Documents'
):
for
file
in
files:
if
file
.endswith(
'.txt'
):
path
=
os.path.join(folder,
file
)
print
(
'deleted : '
, path )
send2trash.send2trash(path)
Output:
deleted : /Users/tithighosh/Documents/cfile.txt
deleted : /Users/tithighosh/Documents/e_also_big_output.txt
deleted : /Users/tithighosh/Documents/res.txt
deleted : /Users/tithighosh/Documents/tk.txt
Python a Delete File using os.rmdir
In the os.rmdir
method removes an empty directory specified by the given path. It is important to note that if the directory contains any files or subdirectories, the method will raise an OSError. Therefore, it’s essential to ensure that the directory is empty before using this method.
Example : In this example, replace 'path/to/empty_directory'
with the actual path of the empty directory you want to delete. The delete_empty_directory
function attempts to remove the specified directory using os.rmdir
and prints a success message if the deletion is successful
Python3
import
os
def
delete_empty_directory(directory_path):
try
:
os.rmdir(directory_path)
print
(f
'The directory "{directory_path}" has been successfully deleted.'
)
except
OSError as e:
print
(f
'Error: {e}'
)
directory_to_delete
=
'path/to/empty_directory'
delete_empty_directory(directory_to_delete)
Output :
The directory "path/to/empty_directory" has been successfully deleted.
Related Article
Delete a directory or file using Python
How to delete data from file in Python
Delete files older than N days in Python
Пройдите тест, узнайте какой профессии подходите
Часто в ходе работы с файлами и папками на языке Python возникает необходимость их удаления. Например, может потребоваться очистить директорию от ненужных
Часто в ходе работы с файлами и папками на языке Python возникает необходимость их удаления. Например, может потребоваться очистить директорию от ненужных файлов или удалить временные файлы, созданные в ходе выполнения программы.
Для выполнения таких операций в Python существуют специальные функции, которые позволяют удалять как отдельные файлы, так и целые папки.
Освойте Python на курсе от Skypro. Вас ждут 400 часов обучения и практики (достаточно десяти часов в неделю), подготовка проектов для портфолио, индивидуальная проверка домашних заданий и помощь опытных наставников. Получится, даже если у вас нет опыта в IT.
Удаление файла
Для удаления файла в Python используется функция os.remove()
. Она принимает один аргумент — путь к удаляемому файлу.
import os os.remove("/путь/к/файлу.txt")
Если файл, указанный в аргументе, не существует, то будет выдана ошибка FileNotFoundError
.
Удаление папки
Для удаления папки используется функция os.rmdir()
. Она также принимает один аргумент — путь к удаляемой папке.
import os os.rmdir("/путь/к/папке")
При использовании этой функции важно помнить, что она удаляет только пустые папки. Если в папке есть файлы или другие папки, то будет выдана ошибка OSError
.
Если же требуется удалить папку со всем её содержимым, то в этом случае можно использовать функцию shutil.rmtree()
.
import shutil shutil.rmtree("/путь/к/папке")
Эта функция удалит указанную папку вместе со всем её содержимым, даже если в ней есть другие папки и файлы.
Выполняя операции удаления, всегда нужно быть внимательным и убедиться, что удаляемые файлы или папки больше не нужны, так как их восстановление может быть невозможным.
На курсе Skypro «Python-разработчик» освоите основные инструменты программирования, получите опыт на реальных проектах и сможете стартовать в профессии уверенным новичком. Преподаватели — практикующие программисты с большим опытом, а в центре карьеры помогут составить цепляющее резюме и подготовиться к собеседованию.
Для работы с файловой системой в Python используют модули
os, os.path и shututil, а для операций с файлами – встроенные функции open(), close(), read(), readline(), write() и т. д. Прежде, чем мы перейдем
к примерам использования конкретных методов, отметим один важный момент – корректный формат пути к файлам и каталогам.
Дело в том, что Python считает некорректным стандартный
для Windows формат: если указать путь к файлу в привычном виде 'C:\Users\User\Python\letters.py'
, интерпретатор вернет ошибку. Лучше
всего указывать путь с помощью r-строк
или с экранированием слэшей:
r'C:\Users\User\Python\letters.py'
'C:\\Users\\User\\Python\\letters.py'
Иногда также путь указывают с обратными слэшами:
'C:/Users/User/Python/letters.py'
🐍🎓 Библиотека собеса по Python
🐍🧩 Библиотека задач по Python
Получение информации о файлах и директориях
Метод getcwd() возвращает
путь к текущей рабочей директории в виде строки:
>>> import os
>>> os.getcwd()
'C:\\Users\\User\\Python'
С помощью метода os.listdir() можно получить список всех поддиректорий и файлов текущего рабочего каталога, при этом содержимое вложенных папок не отображается:
>>> os.listdir()
['Data', 'lambda_functions.py', 'letters.py', 'os_methods.py', 'passw_generator.py', 'points.py', 'population.py']
Метод os.walk() возвращает генератор, в котором содержится
вся информация о рабочем каталоге, включая содержимое всех поддиректорий:
>>> import os
>>> my_cwd = os.getcwd()
>>> result = os.walk(my_cwd)
>>> for i, j, k in result:
for file in k:
print(file)
lambda_functions.py
letters.py
os_methods.py
passw_generator.py
points.py
population.py
books_to_process.txt
challenge_data.txt
ledger.txt
Много полезных методов содержится в модуле os.path. Так можно извлечь имя файла из полного пути:
>>> os.path.basename(r'C:\Users\User\Python\letters.py')
'letters.py'
А так можно получить путь к директории / файлу, в который не
включается собственно поддиректория или имя файла:
>>> os.path.dirname(r'C:\Users\User\Python\Data')
'C:\\Users\\User\\Python'
Метод path.isabs() покажет, является ли
путь абсолютным или относительным:
>>> os.path.isabs(r'C:\Users\User\Python\Data')
True
>>> os.path.isabs(r'.\Python\Data')
False
>>>
Метод path.isdir() возвращает True
, если переданная в метод директория существует, и False
– в противном случае:
>>> os.path.isdir(r'C:\Users\User\Python\Data\Samples')
False
Для установления факта существования файла служит path.isfile():
>>> os.path.isfile(r'C:\Users\User\Python\matrix_challenge.py')
False
Для преобразования пути в нижний регистр и нормализации слэшей используют path.normcase():
>>> os.path.normcase('C:/Users/User/Python')
'c:\\users\\user\\python'
Хотя путь к файлу (директории) представляет собой строку,
создавать полный путь с помощью конкатенации считается моветоном – нужно
использовать метод os.path.join():
# Неправильно:
my_cwd = os.getcwd()
file_name = 'my_solution.py'
path = my_cwd + '\\' + file_name
# Правильно:
path = os.path.join(my_cwd, file_name)
Результат:
C:\Users\User\Python\my_solution.py
Операции с каталогами и файлами в Python
Для создания новых директорий служит os.mkdir(); в метод нужно передать полный путь, включающий название
нового каталога:
import os
my_cwd = os.getcwd()
new_dir = 'Solutions'
path = os.path.join(my_cwd, new_dir)
os.mkdir(path)
print(os.listdir())
Результат:
['Data', 'lambda_functions.py', 'letters.py', 'os_methods.py', 'passw_generator.py', 'points.py', 'population.py', 'Solutions']
Изменить рабочую директорию можно с помощью метода os.chdir(), это аналог CLI команды cd
:
>>> import os
>>> os.getcwd()
'C:\\Users\\User\\Python'
>>> os.chdir(r'C:\Users\User\Python\Data')
>>> os.getcwd()
'C:\\Users\\User\\Python\\Data'
Использование os.chdir()
может привести к ошибке, если путь к переданной в метод директории указан
неправильно или не существует. Поэтому этот метод стоит использовать только с
обработкой ошибок:
import sys, os
my_cwd = os.getcwd()
new_cwd = r'C:\Users\User\Python\MyData'
try:
os.chdir(new_cwd)
print(f'Изменяем рабочую директорию на {os.getcwd()}')
except:
print(f'Произошла ошибка {sys.exc_info()}')
finally:
print('Восстанавливаем рабочую директорию на прежнюю')
os.chdir(my_cwd)
print(f'Текущая рабочая директория - {os.getcwd()}')
Вывод:
Произошла ошибка (<class 'FileNotFoundError'>, FileNotFoundError(2, 'Не удается найти указанный файл'), <traceback object at 0x024E9828>)
Восстанавливаем рабочую директорию на прежнюю
Текущая рабочая директория - C:\Users\User\Python
Python для новичков: бессрочный доступ к знаниям и поддержка экспертов
Онлайн-курс «Основы программирования на Python» от Proglib academy предлагает 32 практических урока с персональной обратной связью от экспертов, где вы создадите 4 реальных проекта для портфолио и получите все необходимые навыки для старта карьеры в IT.
Создание директорий в Python
Для создания новых каталогов используют два метода:
- os.mkdir() – аналог CLI команды
mkdir
; создает новую папку по указанному пути, при условии, что все указанные промежуточные (вложенные) директории уже существуют. - os.makedirs() – аналог CLI команды
mkdir -p dir1\dir2
; помимо создания целевой папки, создает все промежуточные директории, если они не существуют.
Пример использования os.mkdir():
import os
new_dir = 'NewProjects'
parent_dir = r 'C:\Users\User\Python'
path = os.path.join(parent_dir, new_dir)
os.mkdir(path)
print(f'Директория {new_dir} создана: {os.listdir()}')
Результат:
Директория NewProjects создана: ['Data', 'lambda_functions.py', 'letters.py', 'NewProjects', 'os_methods.py', 'Other', 'passw_generator.py', 'points.py', 'population.py', 'Solutions']
Пример использования makedirs():
import os
new_dir = 'Django'
parent_dir = r'C:\Users\User\Python\Other\Projects\Modules'
path = os.path.join(parent_dir, new_dir)
os.makedirs(path)
print(f'Директория {new_dir} создана по адресу {os.path.dirname(path)}')
Результат:
Директория Django создана по адресу C:\Users\User\Python\Other\Projects\Modules
Копирование файлов и директорий в Python
Для копирования файлов используют метод shutil.copy2(), который принимает два аргумента
– источник файла и директорию, в которую нужно скопировать файл:
import os
import shutil
dest_path = r'C:\Users\User\Python\Data'
source_path = r'C:\Users\User\lambda_exp.txt'
print(f'Файлы в директории {os.path.basename(dest_path)} до копирования файла \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
copy_file = shutil.copy2(source_path, dest_path)
print(f'Файлы в директории {os.path.basename(dest_path)} после копирования файла \
{os.path.basename(source_path)}: {os.listdir(dest_path)}')
Вывод:
Файлы в директории Data до копирования файла lambda_exp.txt: ['books_to_process.txt', 'challenge_data.txt', 'ledger.txt']
Файлы в директории Data после копирования файла lambda_exp.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt', 'ledger.txt']
Помимо метода shutil.copy2(),
для копирования файлов можно пользоваться методом shutil.copy(). Разница между
этими двумя методами в том, что в отличие от shutil.copy2(),
метод shutil.copy() копирует только
содержимое файла, но не метаданные:
import os
import shutil
dest_path = r'C:\Users\User\Python\Data'
source_path = r'C:\Users\User\logfile.txt'
print(f'Файлы в директории {os.path.basename(dest_path)} до копирования файла \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
print(f'Метаданные: {os.stat(source_path)}\n')
copy_file = shutil.copy(source_path, dest_path)
print(f'Файлы в директории {os.path.basename(dest_path)} после копирования файла \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
print(f'Метаданные: {os.stat(dest_path)}\n')
Вывод:
Файлы в директории Data до копирования файла logfile.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt']
Метаданные: os.stat_result(st_mode=33206, st_ino=18014398509552989, st_dev=4236505663, st_nlink=1, st_uid=0, st_gid=0, st_size=455, st_atime=1629682315, st_mtime=1629681887, st_ctime=1629682315)
Файлы в директории Data после копирования файла logfile.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt', 'logfile.txt']
Метаданные: os.stat_result(st_mode=16895, st_ino=11821949021901021, st_dev=4236505663, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1675257729, st_mtime=1675257729, st_ctime=1675084801)
Все содержимое каталога сразу можно скопировать с помощью shutil.copytree():
import os
import shutil
dest_path = r'C:\Users\User\Python\Other\Files'
source_path = r'C:\Users\User\Python\Other\Scripts'
print(f'Содержимое директории {os.path.basename(dest_path)} до копирования каталога \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
copy_dir = shutil.copytree(source_path, dest_path, dirs_exist_ok=True)
print(f'Содержимое директории {os.path.basename(dest_path)} после копирования \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
Вывод:
Содержимое директории Files до копирования каталога Scripts: []
Содержимое директории Files после копирования Scripts: ['progression.py', 'sitemap_generator.py']
Перемещение файлов и директорий
Для перемещения файлов используют метод shutil.move():
import os
import shutil
dest_path = r'C:\Users\User\Python\Other\Scripts'
source_path = r'C:\Users\User\Desktop\sitemap_generator.py'
print(f'Содержимое директории {os.path.basename(dest_path)} до копирования каталога \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
copy_dir = shutil.move(source_path, dest_path)
print(f'Содержимое директории {os.path.basename(dest_path)} после копирования \
{os.path.basename(source_path)}: {os.listdir(dest_path)}\n')
Вывод:
Содержимое директории Scripts до копирования каталога sitemap_generator.py: ['progression.py', 'wiki_scraping.py']
Содержимое директории Scripts после копирования sitemap_generator.py: ['progression.py', 'sitemap_generator.py', 'wiki_scraping.py']
Для перемещения содержимого всей директории в качестве
функции указывают shutil.copytree():
copy_dir = shutil.move(source_path, dest_path, copy_function = shutil.copytree)
Удаление файлов и директорий
Для удаления директории вместе со всеми файлами используют shutil.rmtree():
import os
import shutil
dir_path = r'C:\Users\User\Python\Other'
remove_dir = 'Files'
path = os.path.join(dir_path, remove_dir)
print(f'Содержимое директории {os.path.basename(dir_path)} до удаления каталога \
{remove_dir}: {os.listdir(dir_path)}\n')
shutil.rmtree(path)
print(f'Содержимое директории {os.path.basename(dir_path)} после удаления \
{remove_dir}: {os.listdir(dir_path)}\n')
Вывод:
Содержимое директории Other до удаления каталога Files: ['Files', 'Projects']
Содержимое директории Other после удаления Files: ['Projects']
Другой метод для удаления пустых директорий – os.rmdir():
import os
import shutil
dir_path = r'C:\Users\User\Python\Other'
remove_dir = 'Scripts'
path = os.path.join(dir_path, remove_dir)
print(f'Содержимое директории {os.path.basename(dir_path)} до удаления каталога \
{remove_dir}: {os.listdir(dir_path)}\n')
os.rmdir(path)
print(f'Содержимое директории {os.path.basename(dir_path)} после удаления \
{remove_dir}: {os.listdir(dir_path)}\n')
Вывод:
Содержимое директории Other до удаления каталога Scripts: ['Projects', 'Scripts']
Содержимое директории Other после удаления Scripts: ['Projects']
Очевидный минус метода os.rmdir()
в том, что он работает только на пустых директориях – если поместить в каталог Scripts хотя бы один файл,
удалить его с os.rmdir() уже не получится:
Traceback (most recent call last):
File "C:\Users\User\Python\os_methods.py", line 8, in <module>
os.rmdir(path)
OSError: [WinError 145] Папка не пуста: 'C:\\Users\\User\\Python\\Other\\Scripts'
Для удаления файлов используют метод os.remove():
import os
import shutil
dir_path = r'C:\Users\User\Python\Other\Scripts'
remove_file = 'tetris_game.py'
path = os.path.join(dir_path, remove_file)
print(f'Содержимое директории {os.path.basename(dir_path)} до удаления файла \
{remove_file}: {os.listdir(dir_path)}\n')
os.remove(path)
print(f'Содержимое директории {os.path.basename(dir_path)} после удаления \
{remove_file}: {os.listdir(dir_path)}\n')
Вывод:
Содержимое директории Scripts до удаления файла tetris_game.py: ['tetris_game.py']
Содержимое директории Scripts после удаления tetris_game.py: []
Работа с файлами в Python
Открыть файл для проведения каких-либо манипуляций можно
двумя способами:
- С помощью функции open() – в этом случае после завершения работы нужно будет закрыть файл с помощью close():
f = open('task.txt', 'a', encoding='utf-8')
f.write('\n2) Написать модуль авторизации')
f.close()
- С использованием менеджера контекста with, который автоматически и самостоятельно закроет файл, когда надобность в нем отпадет:
with open('task.txt', 'a', encoding='utf-8') as f:
f.write('\n2) Написать модуль авторизации')
Типы файлов
В Python все файлы делятся на:
- Текстовые
't'
- Бинарные (двоичные)
'b'
Если никакой определенный тип файла не указан, по умолчанию Python считает, что пользователь работает с текстовыми файлами. Поэтому для работы с изображениями, мультимедийными файлами и pdf, например, следует указывать, что тип файла относится к 'b'
.
Режимы доступа и записи
‘r’ | Открывает файл для чтения. Возвращает ошибку, если указанный файл не существует. |
‘w’ | Открывает файл для записи, причем перезаписывает содержимое, если оно есть. Создает файл, если он не существует. |
‘a’ | Открывает файл для записи и добавляет новую информацию, не перезаписывая существующую. Создает файл, если он не существует. |
‘w+’ | Открывает файл для чтения и записи, перезаписывает содержимое. |
‘r+’ | Открывает файл для чтения и дополнения, не перезаписывает содержимое. |
‘x’ | Создает новый пустой файл. Возвращает ошибку, если файл с таким именем уже существует. |
Примечание: для операций с двоичными файлами к указанным
параметрам нужно добавлять b
,
то есть вместо 'r'
должно быть 'rb'
, а
вместо 'w+'
– 'wb+'
.
Методы работы с файлами
Для чтения данных используют read(). Метод read() по умолчанию возвращает все содержимое файла:
with open('books.txt', 'r', encoding='utf-8') as f:
info = f.read()
print(info)
Вывод:
1. "Террор", Дэн Симмонс
2. "Она же Грейс", Маргарет Этвуд
3. "Облачный атлас", Дэвид Митчелл
4. "Искупление", Иэн Макьюэн
5. "Госпожа Бовари", Гюстав Флобер
При необходимости объем выводимой информации можно ограничить
определенным количеством символов:
with open('movies.txt', 'r', encoding='utf-8') as f:
info = f.read(15)
print(info)
Вывод:
1. "Из машины"
Метод readline()
позволяет считывать информацию из текстовых файлов построчно:
with open('books.txt', 'r', encoding='utf-8') as f:
info = f.readline()
print(info)
Вывод:
1. "Террор", Дэн Симмонс
Для получения всех строк файла используют метод readlines(),
который возвращает содержимое в виде списка – вместе со всеми спецсимволами:
with open('books.txt', 'r', encoding='utf-8') as f:
info = f.readlines()
print(info)
Вывод:
['1. "Террор", Дэн Симмонс\n', '2. "Она же Грейс", Маргарет Этвуд\n', '3. "Облачный атлас", Дэвид Митчелл\n', '4. "Искупление", Иэн Макьюэн\n', '5. "Госпожа Бовари", Гюстав Флобер']
Чтобы избавиться от лишних пробелов, символа новой строки (и любых других
спецсимволов), используют методы rstrip(), lstrip()
или strip():
with open('books.txt', 'r', encoding='utf-8-sig') as f:
info = [line.strip() for line in f.readlines()]
print(info)
Вывод:
['1. "Террор", Дэн Симмонс', '2. "Она же Грейс", Маргарет Этвуд', '3. "Облачный атлас", Дэвид Митчелл', '4. "Искупление", Иэн Макьюэн', '5. "Госпожа Бовари", Гюстав Флобер']
Для записи информации в файл используют метод write():
with open('books.txt', 'a', encoding='utf-8') as f:
f.write('\n6. "Война и мир", Лев Толстой\n')
Или writelines():
with open('books.txt', 'a', encoding='utf-8') as f:
f.writelines(['7. "Преступление и наказание", Федор Достоевский\n',
'8. "Мизери", Стивен Кинг\n',
'9. "Джейн Эйр", Шарлотта Бронте\n'])
Кроме того, записывать данные в файл можно с помощью print():
with open('crm_log.txt', 'a', encoding='utf-8') as file:
print('\nСергей Леонов, 11:18, 12:23', file=file)
Чтобы узнать текущую позицию курсора в файле, используют метод tell():
with open('books.txt', 'r', encoding='utf-8-sig') as f:
f.readline()
f.read(5)
print(f.tell())
Вывод:
51
Для считывания данных из определенной позиции используют seek():
with open('movies.txt', 'r', encoding='utf-8') as f:
f.seek(53)
print(f.read())
Вывод:
3. "Дракула Брэма Стокера"
Практика
Задание 1
Имеется файл books.txt, содержащий следующую
информацию:
1. "Террор", Дэн Симмонс
2. "Она же Грейс", Маргарет Этвуд
3. "Облачный атлас", Дэвид Митчелл
4. "Искупление", Иэн Макьюэн
5. "Госпожа Бовари", Гюстав Флобер
6. "Война и мир", Лев Толстой
7. "Преступление и наказание", Федор Достоевский
8. "Мизери", Стивен Кинг
9. "Джейн Эйр", Шарлотта Бронте
Напишите программу, которая выводит первые 3 строки файла.
Решение:
with open('books.txt', 'r', encoding='utf-8') as file:
for i in range(3):
line = file.readline().strip()
print(line)
Задание 2
Напишите программу, которая получает от пользователя имя
файла и возвращает следующие данные о его содержимом:
- количество строк;
- количество слов;
- число символов без пробелов и точек.
Пример ввода:
series.txt
Содержимое файла:
1. Последнее королевство 2015
2. Рим 2005
3. Версаль 2015
4. Тюдоры 2007
5. Террор 2018
6. Человек в высоком замке 2015
7. Белая королева 2013
8. Братья по оружию 2001
9. Медичи 2016
10. Спартак 2010
Вывод:
Количество строк в файле series.txt: 10
Количество слов: 17
Число символов: 153
Решение:
filename = input()
lines, words, symbols = 0, 0, 0
with open(filename, 'r', encoding='utf-8') as file:
for i in file:
lines += 1
words += len([w for w in i.split() if w.isalpha()])
symbols += len([s for s in i if s.isalnum()])
print(f'Количество строк в файле {filename}: {lines}\n'
f'Количество слов: {words}\n'
f'Число символов: {symbols}\n'
)
Задание 3
Напишите программу, которая находит самое длинное слово в
списке книг из первого задания.
Ожидаемый результат:
Преступление
Решение:
with open('books.txt', 'r', encoding='utf-8') as file:
words = file.read().replace('"', '').split()
result = [w for w in words if len(w) == len(max(words, key=len))]
print(*result)
Задание 4
Имеется файл fruit.txt со
следующим содержимым:
Апельсин маракуйя папайя айва Яблоко
апельсин яблоко ананас банан персик Слива
Банан груша слива виноград авокадо Цитрон
Слива Груша яблоко мандарин цитрон
лимон Лайм апельсин ананас персик айва
Хурма киви хурма манго авокадо лайм
Нектарин Инжир гранат Папайя Гранат
Напишите программу, которая подсчитывает, сколько раз
название каждого фрукта встречается в тексте.
Вывод:
Названия этих фруктов встречаются в тексте:
"апельсин" - 3 раз(а)
"маракуйя" - 1 раз(а)
"папайя" - 2 раз(а)
"айва" - 2 раз(а)
"яблоко" - 3 раз(а)
"ананас" - 2 раз(а)
"банан" - 2 раз(а)
"персик" - 2 раз(а)
"слива" - 3 раз(а)
"груша" - 2 раз(а)
"виноград" - 1 раз(а)
"авокадо" - 2 раз(а)
"цитрон" - 2 раз(а)
"мандарин" - 1 раз(а)
"лимон" - 1 раз(а)
"лайм" - 2 раз(а)
"хурма" - 2 раз(а)
"киви" - 1 раз(а)
"манго" - 1 раз(а)
"нектарин" - 1 раз(а)
"инжир" - 1 раз(а)
"гранат" - 2 раз(а)
Решение:
with open('fruit.txt', 'r', encoding='utf-8') as file:
result = {}
for line in file:
words = line.strip().lower().split()
for w in words:
result[w] = result.get(w, 0) + 1
print(f'Названия этих фруктов встречаются в тексте:')
for k, v in result.items():
print(f'"{k}" - {v} раз(а)'
Задание 5
Имеются два файла, first.txt и second.txt. В первом файле
перечислены имена, во втором – должности:
Содержимое файла first.txt
Сергей Ковалев
Ирина Егорова
Никита Степанов
Марина Арефьева
Кирилл Евстегнеев
Елена Моисеева
Файл second.txt
мидл разработчик
девопс
тимлид
сеньор разработчик
продакт-менеджер
дизайнер
Напишите программу, которая открывает оба файла и выводит
сведения о сотрудниках в следующем формате:
Сотрудник Сергей Ковалев, должность - мидл разработчик
Сотрудник Ирина Егорова, должность - девопс
Сотрудник Никита Степанов, должность - тимлид
Сотрудник Марина Арефьева, должность - сеньор разработчик
Сотрудник Кирилл Евстегнеев, должность - продакт-менеджер
Сотрудник Елена Моисеева, должность – дизайнер
Решение:
with open('first.txt', 'r', encoding='utf-8') as file1, \
open('second.txt', 'r', encoding='utf-8') as file2:
for line_x, line_y in zip(file1, file2):
print(f'Сотрудник {line_x.strip()}, должность - {line_y.strip()}')
Задание 6
Напишите программу, которая:
- генерирует коды букв русского алфавита от а до я;
- вставляет в полученный список код ё;
- записывает полный алфавит (строчный и прописной варианты каждой буквы) в столбик в файл alphabet.txt.
Содержимое файла после выполнения программы:
Аа
Бб
Вв
Гг
Дд
Ее
Ёё
Жж
Зз
Ии
Йй
Кк
Лл
Мм
Нн
Оо
Пп
Рр
Сс
Тт
Уу
Фф
Хх
Цц
Чч
Шш
Щщ
Ъъ
Ыы
Ьь
Ээ
Юю
Яя
Решение:
alpha = [i for i in range(ord('а'), ord('я') + 1)]
alpha.insert(6, 1105)
with open('alphabet.txt', 'w', encoding='utf-8') as file:
for i in alpha:
file.write(chr(i).upper() + chr(i) + '\n')
Задание 7
Сведения о доходах и расходах компании хранятся в двух
файлах, income.txt и
outcome.txt. Напишите программу для
подсчета прибыли компании.
Пример файла income.txt:
RUB100000
RUB200000
RUB200000
RUB500000
RUB600000
RUB100000
RUB700000
Пример файла outcome.txt:
-RUB1000
-RUB2000
-RUB50000
-RUB200000
-RUB10000
-RUB5000
-RUB6000
-RUB10000
-RUB19000
-RUB7000
Ожидаемый результат:
Прибыль за прошлый месяц: 2090000 RUB
Решение:
income, outcome = 0, 0
with open('income.txt', 'r', encoding='utf-8') as file1, \
open('outcome.txt', 'r', encoding='utf-8') as file2:
for line in file1:
num = line.strip()[3:]
income += int(num)
for line in file2:
num = line.strip()[4:]
outcome += int(num)
print(f'Прибыль за прошлый месяц: {income - outcome} RUB')
Задание 8
Напишите программу, которая считывает сведения об
успеваемости по основным предметам из файла grades.txt,
и определяет, кто из студентов имеет средний балл >= 4.5.
Пример файла grades.txt:
Арефьева И. 5 5 4 4
Богданов С. 5 5 3 4
Гаврилов Е. 4 4 3 3
Егорова А. 3 3 3 4
Семенова Е. 4 3 3 4
Хворостов И. 5 4 5 5
Ожидаемый результат:
Арефьева И., средний балл: 4.50
Хворостов И., средний балл: 4.75
Решение:
result = {}
with open('grades.txt', 'r', encoding='utf-8') as file1:
for line in file1:
l = line.strip().split()
grades = [int(i) for i in l[-4:]]
aver_grade = sum(grades) / len(grades)
if aver_grade >= 4.5:
result[l[0] + ' ' + l[1]] = aver_grade
for student, aver_grade in result.items():
print(f'{student}, средний балл: {aver_grade:.2f}')
Задание 9
Напишите программу, которая получает от пользователя
название файла с информацией на русском языке, и выполняет транслитерацию
текста в соответствии с приведенным ниже словарем. Результат нужно записать в
файл result.txt.
Словарь:
translit = {'а': 'a', 'к': 'k', 'х': 'h', 'б': 'b', 'л': 'l', 'ц': 'c', 'в': 'v', 'м': 'm', 'ч': 'ch', 'г': 'g', 'н': 'n',
'ш': 'sh', 'д': 'd', 'о': 'o', 'щ': 'shh', 'е': 'e', 'п': 'p', 'ъ': '*', 'ё': 'jo', 'р': 'r', 'ы': 'y', 'ж': 'zh',
'с': 's', 'ь': "'", 'з': 'z', 'т': 't', 'э': 'je', 'и': 'i', 'у': 'u', 'ю': 'ju', 'й': 'j', 'ф': 'f', 'я': 'ya',
'А': 'A', 'К': 'K', 'Х': 'H', 'Б': 'B', 'Л': 'L', 'Ц': 'C', 'В': 'V', 'М': 'M', 'Ч': 'Ch', 'Г': 'G', 'Н': 'N',
'Ш': 'Sh', 'Д': 'D', 'О': 'O', 'Щ': 'Shh', 'Е': 'E', 'П': 'P', 'Ъ': '*', 'Ё': 'Jo', 'Р': 'R', 'Ы': 'Y', 'Ж': 'Zh',
'С': 'S', 'Ь': "'", 'З': 'Z', 'Т': 'T', 'Э': 'Je', 'И': 'I', 'У': 'U', 'Ю': 'Ju', 'Й': 'J', 'Ф': 'F', 'Я': 'Ya'}
Пример русского текста:
Python — это язык программирования, который широко используется в интернет-приложениях, разработке программного обеспечения, науке о данных и машинном обучении (ML). Разработчики используют Python, потому что он эффективен, прост в изучении и работает на разных платформах.
Ожидаемое содержимое result.txt:
Python — jeto yazyk programmirovaniya, kotoryj shiroko ispol'zuetsya v internet-prilozheniyah, razrabotke programmnogo obespecheniya, nauke o dannyh i mashinnom obuchenii (ML). Razrabotchiki ispol'zujut Python, potomu chto on jeffektiven, prost v izuchenii i rabotaet na raznyh platformah.
Решение:
translit = {'а': 'a', 'к': 'k', 'х': 'h', 'б': 'b', 'л': 'l', 'ц': 'c', 'в': 'v', 'м': 'm', 'ч': 'ch', 'г': 'g', 'н': 'n',
'ш': 'sh', 'д': 'd', 'о': 'o', 'щ': 'shh', 'е': 'e', 'п': 'p', 'ъ': '*', 'ё': 'jo', 'р': 'r', 'ы': 'y', 'ж': 'zh',
'с': 's', 'ь': "'", 'з': 'z', 'т': 't', 'э': 'je', 'и': 'i', 'у': 'u', 'ю': 'ju', 'й': 'j', 'ф': 'f', 'я': 'ya',
'А': 'A', 'К': 'K', 'Х': 'H', 'Б': 'B', 'Л': 'L', 'Ц': 'C', 'В': 'V', 'М': 'M', 'Ч': 'Ch', 'Г': 'G', 'Н': 'N',
'Ш': 'Sh', 'Д': 'D', 'О': 'O', 'Щ': 'Shh', 'Е': 'E', 'П': 'P', 'Ъ': '*', 'Ё': 'Jo', 'Р': 'R', 'Ы': 'Y', 'Ж': 'Zh',
'С': 'S', 'Ь': "'", 'З': 'Z', 'Т': 'T', 'Э': 'Je', 'И': 'I', 'У': 'U', 'Ю': 'Ju', 'Й': 'J', 'Ф': 'F', 'Я': 'Ya'}
filename = input()
with open(filename, 'r', encoding='utf-8') as source, open('result.txt', 'w', encoding='utf-8') as tr_result:
for l in source.read():
trans = translit.get(l.lower(), l)
tr_result.write(trans if l.islower() else trans.capitalize())
Задание 10
Имеется лог-файл crm_log.txt с
информацией о времени входа пользователей в CRM-систему и о времени выхода. Напишите программу, которая
определяет пользователей, работавших в системе более 4 часов, и записывает их
имена и фамилии в файл best_employees.txt.
Пример лога crm_log.txt:
Егор Тимофеев, 09:10, 16:50
Марина Абрамова, 12:00, 15:59
Никита Круглов, 09:10, 12:45
Анна Семенова, 08:10, 12:30
Юлия Сафонова, 10:10, 10:50
Михаил Колесников, 11:10, 12:10
Ожидаемый результат в файле best_employees.txt:
Егор Тимофеев
Анна Семенова
Решение:
with open('crm_log.txt', encoding='utf-8') as file_input, \
open('best_employees.txt', 'w', encoding='utf-8') as file_output:
for line in file_input:
start, end = [int(h) * 60 + int(m) for t in line.split(', ')[1:] for h, m in [t.split(':')]]
if end - start > 240:
file_output.write(line.split(', ')[0] + '\n')
Подведем итоги
Python
предоставляет множество простых и удобных методов для работы с файловой
системой и файлами. С помощью этих методов можно легко:
- Получать любую информацию о файлах и директориях.
- Создавать, изменять, перемещать и удалять директории и файлы.
- Проводить любые операции с содержимым текстовых и двоичных файлов.
В следующей статье будем изучать регулярные выражения.
***
Содержание самоучителя
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
By Dillion Megida
Python offers many standard utility modules which enable several functions in the applications we build. In this article, we’ll learn about the modules for deleting files and directories.
One of the most popular modules exposed in Python is the os
module. This is one of the standard utility modules. This module offers various functions for interacting with the operating system of a device. It allows us to work with files and directories.
Another module is shutil
which is used for high-level file operations.
In this article, I’ll be showing you how to use these modules in Python to delete files and remove directories. I’ll be testing the examples here on my Mac device, but you can also test them on any other type of device you have with Python installed.
Overview of the os
Module
The os
module allows us to execute operating system tasks on Windows, Mac, and Linux.
To use this module, you first have to import it:
import os
This module has different properties and functions that we can use to access different information about the OS and to also run some file-related tasks.
For example, there’s the name
property which returns the name of the operating system module imported for the device you use the module on. On my Mac device, after running python test.py
(where test.py
is the file with my code) here’s the result I get:
import os
print(os.name)
# posix
There’s also the environ
object which contains all the environment variables and their values:
import os
print(os.environ)
# {
# ...
# 'SHELL': '/bin/zsh',
# 'HOMEBREW_REPOSITORY': '/opt/homebrew',
# ...
# 'ZSH': '/Users/dillion/.oh-my-zsh',
# 'NVM_DIR': '/Users/dillion/.nvm',
# 'USER': 'dillion'
# ...
# }
After running this on my device, I get a bunch of environment variables. I’ve listed a few above, and you can see the SHELL
,ZSH
, and USER
variables.
To get the value of a specific variable, you can use the get()
method. Here are some examples:
import os
homeEnv = os.environ.get('HOME')
# /Users/dillion
shellEnv = os.environ.get('SHELL')
# /bin/zsh
zshEnv = os.environ.get('ZSH')
# /Users/dillion/.oh-my-zsh
userEnv = os.environ.get('USER')
# dillion
Overview of the shutil
Module
While the os
module is more focused on operating system tasks (depending on the operating system in use), the shutil
module is for high-level file operations from Python such as copying and removing files.
To use this module, you also have to import it first:
import shutil
This module also has methods that you can use for file and directory operations. Let’s see some examples.
There’s the move
directory, which allows you to move a file from one location to a destination. Here’s a test.py
example:
import shutil
shutil.move("./test.py", "temp/")
When I run python test.py
, the test.py file is moved to the temp directory. If the file or the directory does not exist, you get an error.
Another method of this module is copytree
, which copies a directory’s contents to a destination. Let’s say we have a folder called directory1/ with the following files:
directory1
├── file1.py
└── test
└── file2.py
This directory has a file named file1.py and a directory called test which in turn contains a file named file2.py.
Now let’s see how to move these files from directory1 to a new directory called directory2:
import shutil
shutil.copytree("directory1/", "directory2/")
When you run the code above, directory2
is created, and the contents of directory1
are copied to directory2
.
Now that we’ve seen some examples, let’s see how to delete a file and remove a directory.
The os
module has a remove()
method which allows you to remove (delete) a file. Such files are deleted permanently – not in the recycle bin. Here’s an example:
import os
os.remove('./temporary.txt')
This method accepts the file path argument, where you specify the location of the file you want to remove. If such a file does not exist, running the command above produces an error like this:
FileNotFoundError: [Errno 2] No such file or directory: './temporary.txt'
So let me first create the file. I’ll do this on my command line like this:
touch temporary.txt
echo "new file" > temporary.txt
Now I have the temporary.txt file with the «new file» text. When I run my Python above, this file will be removed:
python test.py
# file now deleted
Another way to improve your code is to first check if the file exists, before calling the remove
method. You can do this using the path.isfile()
method. Here’s how:
import os
fileExists = os.path.isfile('./temporary.txt')
if fileExists:
os.remove('./temporary.txt')
First, we check if temporary.txt exists by calling the isfile()
method on the path
property of the os
module. This method returns True
or False
depending on the existence of that file. You can then use an if
statement to test the returned boolean before calling the remove
method.
How to Delete a Directory in Python
The os
module also has the rmdir
method which you can use to delete a folder. But, the folder has to be empty. Here’s an example:
import os
os.rmdir('directory1/')
If directory1 exists and is empty, it will be deleted. If it does not exist, you get a No such file or directory error. If it exists but is not empty, you get a Directory not empty error. So how do you delete non-empty directories?
Remember I said shutil
is for high-level file operations? Well, this is where it’s also useful – for deleting empty and non-empty directories.
shutil
has the rmtree
method which is used for removing a directory (and all its contents such as files, sub-files, sub-directories, and so on).
Here’s an example:
import shutil
shutil.rmtree('directory2/')
If directory2 does not exist, you get a No such file or directory error. But if the directory exists and is non-empty, it will be deleted. Even if it’s empty, it will also be deleted.
Wrapping Up
When building applications, sometimes you want to create, delete, modify, copy or perform other file operations. Thanks to some standard modules exposed from Python, these operations are possible.
In this article, I’ve shown you how to use the os
and shutil
standard modules from Python to delete files and directories on a device.
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started