Модуль shutil
Модуль shutil содержит набор функций высокого уровня для обработки файлов, групп файлов, и папок. В частности, доступные здесь функции позволяют копировать, перемещать и удалять файлы и папки. Часто используется вместе с модулем os.
Операции над файлами и директориями
shutil.copyfileobj(fsrc, fdst[, length]) — скопировать содержимое одного файлового объекта (fsrc) в другой (fdst). Необязательный параметр length — размер буфера при копировании (чтобы весь, возможно огромный, файл не читался целиком в память).
При этом, если позиция указателя в fsrc не 0 (т.е. до этого было сделано что-то наподобие fsrc.read(47)), то будет копироваться содержимое начиная с текущей позиции, а не с начала файла.
shutil.copyfile(src, dst, follow_symlinks=True) — копирует содержимое (но не метаданные) файла src в файл dst. Возвращает dst (т.е. куда файл был скопирован). src и dst это строки — пути к файлам. dst должен быть полным именем файла.
Если src и dst представляют собой один и тот же файл, исключение shutil.SameFileError.
Если dst существует, то он будет перезаписан.
Если follow_symlinks=False и src является ссылкой на файл, то будет создана новая символическая ссылка вместо копирования файла, на который эта символическая ссылка указывает.
shutil.copymode(src, dst, follow_symlinks=True) — копирует права доступа из src в dst. Содержимое файла, владелец, и группа не меняются.
shutil.copystat(src, dst, follow_symlinks=True) — копирует права доступа, время последнего доступа, последнего изменения, и флаги src в dst. Содержимое файла, владелец, и группа не меняются.
shutil.copy(src, dst, follow_symlinks=True) — копирует содержимое файла src в файл или папку dst. Если dst является директорией, файл будет скопирован с тем же названием, что было в src. Функция возвращает путь к местонахождению нового скопированного файла.
Если follow_symlinks=False, и src это ссылка, dst будет ссылкой.
Если follow_symlinks=True, и src это ссылка, dst будет копией файла, на который ссылается src
copy() копирует содержимое файла, и права доступа.
shutil.copy2(src, dst, follow_symlinks=True) — как copy(), но пытается копировать все метаданные.
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) — рекурсивно копирует всё дерево директорий с корнем в src, возвращает директорию назначения.
Директория dst не должна существовать. Она будет создана, вместе с пропущенными родительскими директориями.
Права и времена у директорий копируются copystat(), файлы копируются с помощью функции copy_function (по умолчанию shutil.copy2()).
Если symlinks=True, ссылки в дереве src будут ссылками в dst, и метаданные будут скопированы настолько, насколько это возможно.
Если False (по умолчанию), будут скопированы содержимое и метаданные файлов, на которые указывали ссылки.
Если symlinks=False, если файл, на который указывает ссылка, не существует, будет добавлено исключение в список ошибок, в исключении shutil.Error в конце копирования.
Можно установить флаг ignore_dangling_symlinks=True, чтобы скрыть данную ошибку.
Если ignore не None, то это должна быть функция, принимающая в качестве аргументов имя директории, в которой сейчас copytree(), и список содержимого, возвращаемый os.listdir(). Т.к. copytree() вызывается рекурсивно, ignore вызывается 1 раз для каждой поддиректории. Она должна возвращать список объектов относительно текущего имени директории (т.е. подмножество элементов во втором аргументе). Эти объекты не будут скопированы.
shutil.ignore_patterns(*patterns) — функция, которая создаёт функцию, которая может быть использована в качестве ignore для copytree(), игнорируя файлы и директории, которые соответствуют glob-style шаблонам.
shutil.rmtree(path, ignore_errors=False, onerror=None) — Удаляет текущую директорию и все поддиректории; path должен указывать на директорию, а не на символическую ссылку.
Если ignore_errors=True, то ошибки, возникающие в результате неудавшегося удаления, будут проигнорированы. Если False (по умолчанию), эти ошибки будут передаваться обработчику onerror, или, если его нет, то исключение.
На ОС, которые поддерживают функции на основе файловых дескрипторов, по умолчанию используется версия rmtree(), не уязвимая к атакам на символические ссылки.
На других платформах это не так: при подобранном времени и обстоятельствах «хакер» может, манипулируя ссылками, удалить файлы, которые недоступны ему в других обстоятельствах.
Чтобы проверить, уязвима ли система к подобным атакам, можно использовать атрибут rmtree.avoids_symlink_attacks.
Если задан onerror, это должна быть функция с 3 параметрами: function, path, excinfo.
Первый параметр, function, это функция, которая создала исключение; она зависит от платформы и интерпретатора. Второй параметр, path, это путь, передаваемый функции. Третий параметр, excinfo — это информация об исключении, возвращаемая sys.exc_info(). Исключения, вызванные onerror, не обрабатываются.
shutil.move(src, dst, copy_function=copy2) — рекурсивно перемещает файл или директорию (src) в другое место (dst), и возвращает место назначения.
Если dst — существующая директория, то src перемещается внутрь директории. Если dst существует, но не директория, то оно может быть перезаписано.
shutil.disk_usage(path) — возвращает статистику использования дискового пространства как namedtuple с атрибутами total, used и free, в байтах.
shutil.chown(path, user=None, group=None) — меняет владельца и/или группу у файла или директории.
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None) — возвращает путь к исполняемому файлу по заданной команде. Если нет соответствия ни с одним файлом, то None. mode это права доступа, требующиеся от файла, по умолчанию ищет только исполняемые.
Архивация
Высокоуровневые функции для созданиия и чтения архивированных и сжатых файлов. Основаны на функциях из модулей zipfile и tarfile.
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) — создаёт архив и возвращает его имя.
base_name это имя файла для создания, включая путь, но не включая расширения (не нужно писать «.zip» и т.д.).
format — формат архива.
root_dir — директория (относительно текущей), которую мы архивируем.
base_dir — директория, в которую будет архивироваться (т.е. все файлы в архиве будут в данной папке).
Если dry_run=True, архив не будет создан, но операции, которые должны были быть выполнены, запишутся в logger.
owner и group используются при создании tar-архива.
shutil.get_archive_formats() — список доступных форматов для архивирования.
shutil.unpack_archive(filename[, extract_dir[, format]]) — распаковывает архив. filename — полный путь к архиву.
extract_dir — то, куда будет извлекаться содержимое (по умолчанию в текущую).
format — формат архива (по умолчанию пытается угадать по расширению файла).
shutil.get_unpack_formats() — список доступных форматов для разархивирования.
Запрос размера терминала вывода
shutil.get_terminal_size(fallback=(columns, lines)) — возвращает размер окна терминала.
fallback вернётся, если не удалось узнать размер терминала (терминал не поддерживает такие запросы, или программа работает без терминала). По умолчанию (80, 24).
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Как работать с файлами в Python
В любом проекте разработки ПО нам приходится работать с файлами. При помощи Python можно осуществлять довольно много операций. Мы можем:
- выводить список файлов
- перемещать и переименовывать файлы
- удалять файлы
- читать файлы
- записывать в файлы
- добавлять что-либо в файлы
Наверняка можно делать что-то еще, но это те базовые операции, которые мы разберем в этой статье.
Чтобы сэкономить время и лучше изложить материал, я сгруппировал некоторые темы.
Вывод списка файлов и их переименование
В этом разделе я покажу вам, что можно делать при помощи модуля os в Python. Если вы гик вроде меня и хотите иметь возможность переименовывать файлы в соответствии с определенными правилами, Python вам поможет.
Для начала нам нужно получить список всех файлов. После этого мы будем выбирать файлы по одному и переименовывать.
Как получить список файлов в Python
Насколько я знаю, в модуле os нет специального метода, который возвращал бы имена только файлов. Поэтому, получив список файлов и директорий, нам придется отсеять директории. Для этого мы можем воспользоваться методом os.path.isfile() из модуля os . Этот метод возвращает True, если аргумент является файлом. Аналогично, метод os.path.isdir() возвращает True, если аргумент является директорией.
import os # returns name of all files & directory exist in current location files_dir = os.listdir('./blogs') print(files_dir) only_files = [] for i in files_dir: if os.path.isfile('./blogs/'+i): only_files.append(i) only_dir = [] for i in files_dir: if os.path.isdir('./blogs/'+i): only_dir.append(i) print('-'*15) print(only_files) # prints all files print('-'*15) print(only_dir) # prints all directories """ OUTPUT: ['1.txt', '2.txt', '3.txt', '4.txt', '5.txt', '6.txt', '7.txt', '8.txt', 'Test Directory 1', 'Test Directory 2'] --------------- ['1.txt', '2.txt', '3.txt', '4.txt', '5.txt', '6.txt', '7.txt', '8.txt'] --------------- ['Test Directory 1', 'Test Directory 2'] """
Итак, мы получили список всех файлов.
Как переименовать файлы в Python
Чтобы переименовать файлы, мы воспользуемся методом rename() и применим его к каждому файлу. Предположим, мы хотим добавить к файлам префиксы «Odd» (нечетный) и «Even» (четный), основываясь на индексах.
# only_files is a list of all files in the blogs directory for index, file_name in enumerate(only_files): if index % 2 == 0: os.rename('./blogs/'+file_name, './blogs/'+'Even-'+file_name) else: os.rename('./blogs/'+file_name, './blogs/'+'Odd-'+file_name)
Здесь метод enumerate() возвращает номер по счетчику (начинается с 0) и значение из итератора ( only_files ). Мы проверяем, является ли индекс (номер по счетчику) четным, и если да — добавляем префикс «Even» к имени файла. В противном случае добавляем префикс «Odd».
Подробнее о функции enumerate() можно почитать в статье «Как работает функция enumerate() в Python?».
Вероятно, синтаксис метода os.rename() вы поняли, но на всякий случай приведу его:
При использовании этого метода имена (пути) можно писать как целиком, так и в относительном формате (главное — написать правильно). В нашем случае я написал «./blog/». Вторая косая черта указывает на вход внутрь директории blogs. Таким образом, путь к файлу превращается в «./blogs/1.txt».
Перемещение и удаление файлов в Python
Чтобы переместить файл, мы можем воспользоваться модулем os или модулем shutil . Я покажу перемещение файла при помощи метода rename() из модуля os .
Синтаксис rename() тот же, только в качестве второго аргумента указывается путь к целевому файлу с именем самого файла.
Вероятно, это звучит запутано, но пример вам все объяснит:
import os os.rename('./blogs/1.txt', './blogs/Test Directory 1/1.txt') os.rename('./blogs/2.txt', './blogs/Test Directory 2/1.txt')
Итак, в первом методе rename мы берем файл 1.txt из директории blogs и перемещаем его в директорию Test Directory 1 , которая является поддиректорией blogs .
Во втором сценарии мы берем файл 2.txt и тоже перемещаем его в директорию Test Directory 1 , но с именем 1.txt . Да, мы перемещаем и переименовываем файл одновременно. Если вы немного знакомы с командами Linux, вы могли заметить что работа метода os.rename() напоминает работу команды mv в Linux.
А как нам теперь удалить эти файлы?
Нам снова поможет модуль os . Мы воспользуемся методом remove() . Допустим, мы хотим удалить файл 3.txt из директории blogs . Для этого напишем следующий код:
import os os.remove('./blogs/3.txt')
Чтение файлов и запись в них
Чтобы выполнить любую из операций чтения и записи, нам нужно сделать три основных шага:
- Открыть файл
- Выполнить операцию
- Закрыть файл
Мы можем проделывать эти шаги, используя два паттерна. Объяснить их на словах сложно, так что я сделаю это при помощи кода.
# Открыть файл file = open('./blogs/1.txt', 'r', encoding="UTF-8") # Выполнить операцию data = file.read() print(data) # Закрыть файл file.close() """ OUTPUT: Python 101 Series """
Здесь мне нужно было открыть файл, выполнить операцию и закрыть файл вручную. Для открытия файла Python предоставляет метод open() . Синтаксис:
open(файл, режим_доступа, кодировка)
Файл — это местонахождение объекта файла. Режим_доступа представляет режим, в котором мы хотим открыть файл. Вообще можно делать больше одной операции за раз, но об этом позже. Кодировка представляет формат кодировки, в которой мы хотим работать с файлом. Этот параметр опционален. Чаще всего используется UTF-8.
with open('./blogs/1.txt', 'r', encoding="UTF-8") as file: data = file.read() print(data)
Здесь мы используем паттерн контекстного менеджера. Если быть кратким, паттерн контекстного менеджера используется для разумного расходования ресурсов. Проблема первого паттерна в том, что мы можем забыть закрыть файл. В нашем примере это не слишком важно, но если вы оперируете тысячами или даже миллионами файлов, подобная ошибка повлияет на вашу систему. Паттерн контекстного менеджера освобождает ресурсы, как только мы покончили с задачей.
От редакции Pythonist. О контекстных менеджерах можно почитать в статье «Контекстные менеджеры в Python».
Итак, в первой строке мы открываем файл при помощи синтаксиса with open() и присваиваем его переменной file . Мы могли бы сделать то же самое, написав file = open() . Преимущество нашего варианта в том, что Python автоматически освободит этот ресурс после третьей строки.
Поскольку после третьей строки мы окажемся вне контекста with open() , все ресурсы, связанные с переменной file , будут освобождены. Вы будете часто встречать паттерны контекстных менеджеров в коде для обработки файлов в продакшен-системах.
Помимо чтения, мы можем записывать файлы и дополнять их новыми данными. Делается это аналогично. То есть, чтобы записать данные в файл, мы пишем следующий код:
with open('./blogs/temp.txt', 'w', encoding="UTF-8") as file: data = "Python 101 Series" file.write(data)
Если файл с таким именем существует, он будет перезаписан новыми данными. А если такого файла нет, он будет создан и в него будут записаны данные. При этом следует учитывать, что создается только новый файл, директория создана не будет. Если я напишу open(«./blogs/temp/temp.txt», «w»), код выбросит ошибку, потому что внутри директории blogs нет директории temp .
Чтобы данные в файле не перезаписывались, а дополнялись, можно воспользоваться методом append (в коде — аргумент 'a' ). Он добавляет данные в конец открытого файла.
with open('./blogs/temp.txt', 'a') as file: data = "\n New Python 101 Series" file.write(data)
В этом коде сперва Python проверит, существует ли файл temp.txt , затем откроет его и добавит «\n New Python 101 Series» в конец файла. Если файл не существует, Python его создаст и запишет в него эту строку.
Режимы доступа к файлам
Я собрал базовые режимы доступа к файлам в таблице. Но есть и другие режимы, позволяющие оперировать бинарными данными и в бинарном формате. Полный список можно посмотреть в статье «File Access mode In Python».
| Режим | Объяснение |
|---|---|
| r | чтение |
| w | запись |
| a | добавление в файл |
| r+ | Чтение и запись данных в файл. Предыдущие данные в файле не удаляются. |
| w+ | Запись и чтение данных. Существующие данные перезаписываются. |
| a+ | Добавление и чтение данных из файла. Существующие данные не перезаписываются. |
Заключение
В этой статье мы на простых примерах разобрали, как работать с файлами в Python. Я знаю, что запомнить все это за один раз сложно. Но это и не нужно: все придет с практикой, главное — разобраться.
Как переместить файл в другой каталог в Python 1 мин для чтения

Файл используется для постоянного хранения данных. Иногда нам требуется переместить расположение файла с одного пути на другой для целей программирования. Эту задачу можно выполнить с помощью скрипта Python несколькими способами. Move() — это наиболее часто используемый метод Python для перемещения файла из одного каталога в другой каталог, определенный в модуле shutil. Другой способ перемещения файла с помощью метода rename(), который определен в модуле os. Эти два метода можно использовать для перемещения файла из одного каталога в другой, как описано в этой статье.
Пример 1: Переместить файл с исходным именем
Способ перемещения файла из одного места в другое с исходным именем показан в следующем скрипте. Модуль shutil импортируется в скрипт для использования функции move() для перемещения файла. Модуль пути импортируется для использования функции exists() для проверки того, существует ли данное имя файла или нет. Если файл существует, будет определен целевой путь к файлу, куда он будет перемещен. Место назначения будет напечатано после перемещения файла. Если файл не существует, будет напечатано сообщение об ошибке.
# Импортировать модуль shutil import shutil # Импортировать модуль пути из ОС from os import path # Задайте имя файла с путем source_path = "fruit.txt" # Проверьте, существует ли файл if path.exists(source_path): # Задайте путь к каталогу, в который будет перемещен файл destination_path = "Files" # Переместите файл в новое место new_location = shutil.move(source_path, destination_path) # Распечатать новое расположение файла print("% s перемещен в указанное место,% s" % (source_path , new_location)) else : # Распечатать сообщение, если файл не существует print ("Файл не существует.")
Здесь файл fruit.txt существует, и он перемещен в папку Files.
Пример 2. Переместить файл с новым именем
Способ перемещения файла из одного места в другое путем переименования файла показан в следующем сценарии. Модули shutil и path были импортированы для перемещения файла и проверки его существования. Новое имя файла определено в пути назначения файла. Если файл перемещен успешно, то путь к файлу с новым именем будет напечатан, иначе будет напечатано сообщение об ошибке.
# Импорт модуля shutil import shutil # Импорта из OS from os import path # Установить имя файла с путем source_path = «dept.txt» # Проверьте файл существует или нет if path.exists(source_path): # Задайте путь к каталогу назначения с новым именем destination_path = "Files/department.txt" # Переместите файл в новое место new_location = shutil.move(source_path, destination_path) # Распечатать новое расположение файла print(" перемещается в нужное место, ".format(source_path,new_location)) else: # Распечатать сообщение, если файл не существует print("Неверный путь к файлу.")
Скопируйте файл в Python
В этом посте мы обсудим, как скопировать файл в Python.
В Python есть несколько способов копирования файлов. Наиболее распространенные и эффективные из них подробно обсуждаются ниже:
1. Использование shutil.copy2() функция
The shutil Модуль предлагает несколько высокоуровневых функций для поддержки копирования и удаления файлов. Вы можете использовать copy2(src, dst) функция для копирования файла src в файл или каталог dst .
1. Если dst имя файла, содержимое и метаданные файла src копируются. Если dst является существующим файлом, он будет перезаписан src файл.
src = '/src/file.txt'
dest = '/dest/log.txt'
shutil . copy2 ( src , dest )
2. Если dst указывает каталог, мы скопируем src файл в каталог dst . Если файл с таким именем уже существует в месте назначения, он будет перезаписан.
src = '/src/file.txt'
dest = '/dest/dir'
shutil . copy2 ( src , dest )
Главное преимущество copy2() заключается в том, что он может принимать путь к целевому каталогу, а также копировать метаданные файла. Вы также можете использовать copy() функция идентична copy2() функция, за исключением того, что она не может сохранить метаданные.
The shutil модуль также имеет copyfile(src, dst) функция, которая копирует содержимое файла с именем src в целевой файл с именем dst . Метаданные не копируются. Однако он перезаписывает файл назначения, если он уже существует.
