Модуль 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 как скопировать файл в папку с метаданными?
Он копирует файл и создаёт новый с такимиже данными, но мне хотелось бы поменять метаданные(дата и тд). Возможно ли это как-то сделать? Новый данные хронятся в json файле:
"title": "vdVuZnWc-ic.jpg",
"description": "",
"imageViews": "16",
"creationTime": "timestamp": "1630490934",
"formatted": "1 сент. 2021 г., 10:08:54 UTC"
>,
"photoTakenTime": "timestamp": "1601451600",
"formatted": "30 сент. 2020 г., 07:40:00 UTC"
>,
"geoData": "latitude": 0.0,
"longitude": 0.0,
"altitude": 0.0,
"latitudeSpan": 0.0,
"longitudeSpan": 0.0
>,
"geoDataExif": "latitude": 0.0,
"longitude": 0.0,
"altitude": 0.0,
"latitudeSpan": 0.0,
"longitudeSpan": 0.0
>,
"url": "https://lh3.googleusercontent.com/YH5VbMQAjiUmZt6x. ",
"googlePhotosOrigin": "mobileUpload": "deviceFolder": "localFolderName": ""
>,
"deviceType": "ANDROID_PHONE"
>
>,
"photoLastModifiedTime": "timestamp": "1659285436",
"formatted": "31 июл. 2022 г., 16:37:16 UTC"
>
>
- Вопрос задан более года назад
- 119 просмотров
1 комментарий
Простой 1 комментарий
Как скопировать файл через Python без импорта модулей?
P.S. По-моему в задаче ошибка и вместо write должно быть указано copy.
У меня возникла проблема па решению 4-ой части. Единственные варианты - это решение через модуль shutil. Прошу помочь написать его без этого модуля (если это возможно)
Вот остальная часть кода:
while True: a = input("Введите read или copy: ") if a == "read": b = input("Напишите путь к файлу, содержимое которого Вы хотите посмотреть: ") d = "r" try: c = open(b, d) print(c.read()) c.close() except FileNotFoundError: print("Путь указан неправильно, попробуйте ещё раз") continue break #дальше надо написать через elif a == "copy": .
Отслеживать
задан 4 янв 2022 в 15:56
user478946 user478946
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Задача хочет от вас что-то такое:
newfile = b.split('/')[-1] with open(b, 'r') as c: with open('files/' + newfile , 'w') as w: w.write(c.read())
Отслеживать
ответ дан 4 янв 2022 в 16:08
35.5k 3 3 золотых знака 28 28 серебряных знаков 63 63 бронзовых знака
Спасибо за ответ, но я уже придумал ещё один работающий вариант
elif a == "copy": b = input("Напишите путь к файлу, который Вы хотите скопировать: ") d = "r" try: c = open(b, d) m = c.read() c.close() t = input("Напишите путь файла, в который Вы хотите скопировать содержимое: ") d = "a" c = open(t, d) c.write(m) c.close() except FileNotFoundError: print("Путь указан неправильно, попробуйте ещё раз") continue break
Отслеживать
ответ дан 5 янв 2022 в 7:47
user478946 user478946
Это неполный кусок кода, который не может быть рабочим.
3 фев 2022 в 8:12
более того, он не выполняет п.4 условий задачи
2 мая 2023 в 14:12
import shutil while True: print() print("1.Посмотреть файл - R\n2.Скопировать файл - C\n3.Записать скопированное содержимое в другой файл - W\n4.Выход - E") command = input('Введите команду текстом - ').lower() match command: case "e": print('Выход из программы') exit() case "r":#1 path = input('Напишите путь к файлу, содержимое которого Вы хотите посмотреть: ') try: h = open(path,'r') print(h.read()) h.close() except FileNotFoundError: print('Файл с указанным именем не существует') case "c":#1 path = input('Напишите путь к файлу, который Вы хотите скопировать: ') path2 = input('Напишите путь к файлу, куда Вы хотите скопировать: ') try: shutil.copy(path,path2) except FileNotFoundError: print('Файл с указанным именем не существует или некорректно указана дирректория') case "w": path = input('Напишите путь к файлу, содержимое которого Вы хотите скопировать: ') try: h=open(path,'r') text = h.read() print('Информация скопирована') h.close() except FileNotFoundError: print('Файл с указанным именем не существует или некорректно указана дирректория') path2 = input ('Укажите путь куда вы хотите сопировать файл и название файла с атрибутами -') try: h=open(path2,'w') h.write(text) print('Файл создан, текст скопирован') h.close() except FileNotFoundError: print('Файл с указанным именем не существует или некорректно указана дирректория') case _: print('Неизвестная операция')
Как скопировать файлы в Python
Скопировать файлы с помощью Python — это распространённая задача, которую может потребоваться выполнить при работе с файлами. Это может быть полезно, например, при создании резервных копий файлов или при перемещении файлов из одного места в другое.
Пример
Допустим, есть файл с именем source.txt , который находится в директории dir1 . Требуется скопировать этот файл в директорию dir2 под именем destination.txt .
Решение
В Python для копирования файлов можно использовать модуль shutil . Ниже представлен пример кода, который копирует файл source.txt из директории dir1 в директорию dir2 под именем destination.txt .
import shutil shutil.copy2('dir1/source.txt', 'dir2/destination.txt')
В этом примере используется функция copy2() , которая, помимо копирования содержимого файла, также пытается скопировать всю метаинформацию о файле.
Если требуется просто скопировать содержимое файла без метаинформации, можно использовать функцию copy() :
import shutil shutil.copy('dir1/source.txt', 'dir2/destination.txt')
Обратите внимание, что если файл destination.txt уже существует, он будет перезаписан.
Заключение
Python предлагает мощные и гибкие инструменты для работы с файлами, включая копирование. Модуль shutil предлагает простые и эффективные функции для копирования файлов, что делает Python удобным языком для выполнения таких задач.