В этой статье я хочу показать на примерах работу с питоном и файловой системой. Это очень важный аспект, без работы с файлами не обходится ни один язык программирования. Для работы с файловой системой в Python используют модули os, os.path и shututil, а для операций с файлами – встроенные функции open(), close(), read(), readline(), write() и т. д. Одну и ту же операцию можно производить несколькими способами.
Файлы
Создание файла
В Python также существует режим (атрибут) «x» или «‘xb«. «b» — означает бинарный файл. В этом режиме проверяется, есть ли файл. Если файл с определенным именем уже существует, он не будет создан. В режиме 'w' файл создается заново, старый при этом теряется.
Без 'b' создается текстовый файл, представляющий собой поток символов. С ‘b‘ — файл, содержащий поток байтов (двоичный).
|
1 |
my_file = open("BabyFile.txt", "w+") |
- ‘r’ — открывает файл только для чтения (по умолчанию)
- ‘w’ — открывает файл только для записи (удаляет любой существующий файл)
- ‘x’ — открывает файл только для создания, возвращает ошибку, если файл существует
- ‘a’ — открывает файл для добавления в конец, создает файл, если он не существует
- ‘b’ — открывает файл в двоичном режиме
- ‘t’ — открывает файл в текстовом режиме (по умолчанию)
Чтение
|
1 2 |
file_contents == my_ile.read() print(file_contents) |
Если файл был открыт в текстовом режиме, то метод read() возвращает строку. В случае бинарного режима возвращается объект типа bytes.
Метод readline() позволяет получать данные построчно.
|
1 2 |
my_file = open("text.txt") my_file.readline( |
Методу read() может быть передан один аргумент, обозначающий количество символов (если файл был открыт как текстовый) или байт (если файл был открыт как бинарный) для чтения.
|
1 2 |
my_file = open("text.txt") my_file_d = f.read(10) |
Для построчного чтения данных из файла рекомендуется использовать цикл for:
|
1 2 3 |
my_file = open('text.txt') for line in f: print(line, end='') |
Метод readlines() считывает все строки и помещает их в список.
|
1 2 3 4 |
my_file = open("text.txt") fd = f.readlines() >>> fd >>> ['Hello\n', '\tOne\n', ' Two\n', 'Three Four\n', 'Шесть!\n'] |
Запись
|
1 |
my_file.write("Привет, файл!") |
Закрыть
|
1 |
my_file.close() |
С помощью closed (не константа, а так называемый дескриптор, или описатель, данных) проверяют, закрыт файл или нет.
|
1 2 3 4 5 6 |
my_file = open('text.txt') my_file.closed >>> False my_file close() my_file.closed >>> True |
Удалить
|
1 2 |
import os os.remove("/путь/к/файлу.txt") |
Копировать
библиотека shutil включает вызов метода copyfile() . Метод принимает два параметра, один из которых является исходным путем файла, а другой — конечным путем файла.
|
1 2 |
import shutil copyfile(source_path,destination_path) |
второй вариант
|
1 2 |
import shutil shutil.copy('dir1/source.txt', 'dir2/destination.txt') |
Перемещение
|
1 2 |
import shutil shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo") |
еще один способ, функцию os.replace() можно использовать для перемещения файлов или каталогов:
|
1 2 |
# заменить (переместить) этот файл в другой каталог os.replace("renamed-text.txt", "folder/renamed-text.txt") |
Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем (renamed-text.txt), он будет перезаписан.
Переименовать
|
1 |
os.rename('./blogs/'+file_name, './blogs/'+'Even-'+file_name) |
Исключения
При работе с файлами всегда важно обрабатывать возможные исключения. Например, если файл не существует или не доступен для переименования, операция может вызвать исключение. В таком случае, можно использовать блоки try/except для обработки этих исключений:
|
1 2 3 4 5 6 7 8 |
import os try: os.rename('non_existent_file.txt', 'new_name.txt') except FileNotFoundError: print("Файл не найден") except PermissionError: print("Нет доступа для переименования файла") |
try-except. Схематично ниже:|
1 2 3 4 |
try: my_file = open("text10.txt") except IOError: print ("No file") |
Папки
Вывод текущей директории
Для получения текущего рабочего каталога используется os.getcwd():
|
1 2 3 4 |
import os # вывести текущую директорию print("Текущая деректория:", os.getcwd()) |
os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог
Создание папки
|
1 2 |
# создать пустой каталог (папку) os.mkdir("folder") |
Если запустить ее еще раз, будет вызвана ошибка FileExistsError, потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:
|
1 2 3 4 |
# повторный запуск mkdir с тем же именем вызывает FileExistsError, # вместо этого запустите: if not os.path.isdir("folder"): os.mkdir("folder") |
Функция os.path.isdir() вернет True, если переданное имя ссылается на существующий каталог.
Изменение директории
|
1 2 |
# изменение текущего каталога на 'folder' os.chdir("folder") |
Создание вложенных папок
|
1 2 |
# сделать несколько вложенных папок os.makedirs("nested1/nested2/nested3") |
Удаление директорий
|
1 2 |
# удалить папку os.rmdir("folder") |
Для удаления каталогов рекурсивно необходимо использовать os.removedirs():
|
1 2 |
# удалить вложенные папки os.removedirs("nested1/nested2/nested3") |
Проверяем, существует файл или каталог
|
1 |
os.path.exists('sample_data') |
в качестве аргумента можно использовать как имя файла, так и имя директории
Содержимое директории
возвращает список содержимого:
|
1 |
os.listdir('sample_data') |
В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:
|
1 |
from glob import globlist(glob(os.path.join('sample_data', '*.csv'))) |