Python pathlib копирование файлов

Обновлено: 05.07.2024

. как скопировать файл с помощью pathlib в Python 2.7?

спросил(а) 2021-01-13T13:20:23+03:00 10 месяцев, 1 неделя назад

А как насчет этого?

Проблема заключается в том, что pathlib.Path создает объект PosixPath , если вы используете Unix/Linux, WindowsPath , если вы используете Microsoft Windows.

Но shutil.copy() нужна строка в качестве аргументов. Поэтому просто используйте str() здесь, когда вы используете функцию str() для объекта Path , он вернет исходный путь.

ответил(а) 2021-01-13T13:20:23+03:00 10 месяцев, 1 неделя назад

Причина для shutil.copy() не работает в том, что вы не используете последние Python, Python 3.6 shutil.copy() можете обрабатывать объекты Path (или их подклассы). Для более старых версий Python это вызывает ошибку, потому что в тех реализациях shutil ожидаются строковые аргументы для аргументов типа copy , а не pathlib.Path .

На самом деле вы хотите написать:

Вы можете подклассифицировать Path для включения такого метода и адаптировать создание my_file . Мне легче просто трансформировать/обезьяна-патч/утка-пробить его на существующий pathlib.Path

Вы можете поместить этот код в любом месте, пока он выполняется, до вызова метода .copy в любом из экземпляров Path . Аргумент .copy() может быть файлом или каталогом.

ответил(а) 2021-01-13T13:20:23+03:00 10 месяцев, 1 неделя назад

Начиная с Python 3.5, без импорта shutil , вы можете сделать:

Для Python 2.7 pathlib2 предоставляет read_bytes , read_text , write_bytes и write_text .

Файл будет загружен в память, поэтому этот метод не подходит для файлов, размер которых превышает доступную для машин память.

Согласно комментариям, можно использовать write_bytes и read_bytes для копирования текстовых файлов, но если вам нужно иметь дело с кодировкой во время копирования write_text , read_text предоставляет преимущество двух дополнительных параметров:

    encoding - это имя кодировки, используемой для декодирования или кодирования файла. errors - это необязательная строка, которая определяет, как должны обрабатываться ошибки кодирования и декодирования.

Они оба имеют то же значение, что и в open() .

ответил(а) 2021-01-13T13:20:23+03:00 10 месяцев, 1 неделя назад

Вы можете использовать метод переименования pathlib вместо shutil.move().

ответил(а) 2021-01-13T13:20:23+03:00 10 месяцев, 1 неделя назад

Как shutil был преобразован для принятия объектов pathlib.Path в Python 3.6

Как уже упоминалось на qaru.site/questions/417004/. shutil в Python 3.6 может принимать объекты pathlib.Path .

Так как это было довольно волшебно, я решил немного изучить, как это реализовано, чтобы увидеть, смогу ли я использовать эту магию в своих собственных классах.

Объект, представляющий путь к файловой системе. Объект, подобный пути, - это либо объект str или bytes, представляющий путь, либо объект, реализующий протокол os.PathLike. Объект, который поддерживает протокол os.PathLike, может быть преобразован в путь файловой системы str или bytes путем вызова функции os.fspath(); os.fsdecode() и os.fsencode() могут использоваться для гарантии результата str или bytes, соответственно. Представлено PEP 519.

Абстрактный базовый класс для объектов, представляющих путь к файловой системе, например pathlib.PurePath.

Новое в версии 3.6.

abstractmethod __fspath__()

Возвращает представление пути к файловой системе объекта.

Метод должен возвращать только объект str или bytes, причем предпочтение отдается str.

Ключевые коммиты реализации выглядят так:

    3f9183b5aca568867f37c38501fca63911580c66, который в основном изменяет точку манипуляции пути самого низкого уровня в Modules/posixmodule.c 568be63248614a2cdd7666a67ddfd16e817f7db9, который добавляет __fspath__ к pathlib.PurePath

Если вы хотите реализовать свои собственные классы, подобные путям, вы можете сделать это следующим образом:

Перемещение файлов из одного каталога в другой может показаться не таким уж большим делом, но иногда это очень помогает при манипулировании файлами.

В этом руководстве будут представлены некоторые способы перемещения файлов из одного каталога в другой в Python.

Используйте функцию shutil.move() для перемещения файлов в Python

Модуль shutil - это модуль Python, который помогает в высокоуровневых манипуляциях с файлами или набором файлов. Этот модуль используется в таких операциях, как копирование файла откуда-то или удаление файла.

Для перемещения файла из одного каталога в другой с помощью модуля shutil вызывается shutil.move() .

Здесь из модуля os используется функция listdir() , которая используется для получения полного списка всех файлов, находящихся в каталоге. Мы используем цикл for для перемещения файла и отмечаем, что функция move() модуля shutil используется для переноса файлов из одного каталога в другой.

Используйте функции os.rename() или os.replace() для перемещения файлов в Python

Часто пользователю необходимо подключиться к основной системе через Python. В этом случае в дело вступает модуль os . Модуль os в основном действует как посредник между пользователем и операционной системой компьютера, чтобы пользователь мог правильно подключиться к операционной системе.

Одна из функций этого модуля - модуль rename() , используемый для перемещения файлов из одного места в другое. Эта функция перемещает файлы, переименовывая имя каталога этих файлов.

Еще одна функция этого модуля - функция replace() . Эта функция помогает переименовать файл или текущий каталог. Местом назначения должен быть файл, а не каталог. Поэтому, если местом назначения является файл, он будет заменен без каких-либо ошибок.

В заключение, когда конечный пункт назначения файла находится на том же диске, что и исходный, используется функция rename() . А если нужно изменить место назначения файла, то нужно использовать replace() .

Здесь мы также следуем той же процедуре, сначала определяя пути к начальному и конечному каталогам. Затем мы используем функцию listdir() , чтобы получить список всех файлов в текущем каталоге. После этого мы используем цикл for , чтобы перезаписать место назначения этих файлов.

Используйте модуль pathlib для перемещения файлов в Python

Модуль pathlib в Python - это стандартный модуль, используемый для предоставления объекта, используемого для управления различными файлами и словарями. Основной объект для работы с файлами называется Путь.

Проблема в том, что pathlib.Path создает объект PosixPath , если вы используете Unix / Linux, WindowsPath , если вы используете Microsoft Windows.

Но shutil.copy() принимает строку в качестве аргумента. Так что просто используйте функцию str() здесь, когда вы используете функцию str() для объекта Path , он вернет путь, который объект Path называет строкой.

Начиная с Python 3.5, без импорта shutil , вы можете сделать:

Для Python 2.7 pathlib2 предоставляет read_bytes , >, write_bytes и write_text методы.

Файл будет загружен в память, поэтому этот метод не подходит для файлов, размер которых превышает доступную память машины.

Согласно комментариям, можно использовать write_bytes и read_bytes для копирования текстовых файлов, но если вам нужно разобраться с кодировкой во время копирования write_text , read_text представит преимущество из двух дополнительных параметров:

  • encoding - это имя кодировки, используемой для декодирования или кодирования файла.
  • errors - необязательная строка, которая определяет, как должны обрабатываться ошибки кодирования и декодирования

Они оба имеют то же значение, что и в open() .

Причина того, что shutil.copy() не работает, заключается в том, что вы не используете последний Python, Python 3.6 shutil.copy() может обрабатывать Path объекты (или их подклассы). Что для более старых версий Python это приводит к ошибке, потому что эти реализации shutil ожидают строковые аргументы для copy , а не pathlib.Path аргументов типа.

Что вы на самом деле хотите написать:

Вы можете создать подкласс Path, чтобы включить такой метод, и адаптировать создание my_file . Я считаю, что проще просто привить / monkey-patch / duck-punch на существующий pathlib.Path

Вы можете разместить этот код где угодно, если он выполняется перед вызовом метода .copy в любом из Path экземпляров. Аргументом .copy() может быть файл или каталог.

Как shutil был преобразован для принятия pathlib.Path объектов в Python 3.6

Поскольку это казалось довольно волшебным, я решил немного исследовать, как это реализовано, чтобы увидеть, смогу ли я использовать это волшебство в своих собственных классах.

Абстрактный базовый класс для объектов, представляющих путь к файловой системе, например, pathlib.PurePath .

Новое в версии 3.6.

abstractmethod __fspath__()

Возвращает представление пути к файловой системе объекта.

Метод должен возвращать только объект str или bytes, причем предпочтение отдается str.

Ключевые коммиты реализации выглядят так:

Если вы хотите реализовать свои собственные классы, подобные путям, вы можете сделать это следующим образом:

Протестировано в Python 3.6.7, Ubuntu 18.10.

Вы можете использовать pathlib метод переименования вместо shutil. переехать().

Модуль pathlib в Python обеспечивает объектно-ориентированный подход к работе с файлами и каталогами. В модуле pathlib есть классы для работы, как в среде Unix, так и в среде Windows. Самое приятное то, что нам не нужно беспокоиться о базовой операционной системе, модуль pathlib заботится об использовании соответствующего класса в зависимости от операционной системы.

Path Class

Path – самый важный класс в модуле pathlib. Это точка входа для всех функций, предоставляемых модулем pathlib. Он заботится о создании экземпляра реализации конкретного пути на основе операционной системы и делает код независимым от платформы.

схема pathlib в Python

Давайте рассмотрим несколько примеров использования модуля pathlib.

1. Список подкаталогов и файлов внутри каталога

Мы можем использовать функцию Path iterdir() для перебора файлов в каталоге. Затем мы можем использовать функцию is_dir(), чтобы различать файл и каталог.

Если вы запустите ту же программу в Windows, вы получите экземпляры WindowsPath.

2. Список файлов определенного типа

Мы можем использовать функцию Path glob() для перебора списка файлов, соответствующих заданному шаблону. Давайте воспользуемся этой функцией, чтобы распечатать все сценарии Python внутри каталога.

Файлы списка Pathlib в Python

3. Устранение символических ссылок на канонический путь

Мы можем использовать функцию resolve() для преобразования символических ссылок в их канонические пути.

4. Проверьте, существует ли файл или каталог

Функция Path exists() возвращает True, если путь существует, в противном случае возвращает False.

5. Открытие и чтение содержимого файла

Мы можем использовать функцию Path open(), чтобы открыть файл. Он возвращает файловый объект, такой как встроенная функция open().

6. Получение информации о файле

Функция stat() объекта Path выполняет системный вызов stat() и возвращает результаты. Вывод такой же, как у функции stat() модуля os.

7. Получение имени файла или каталога

Мы можем использовать свойство «name», чтобы получить имя файла из объекта пути.

8. Создание и удаление каталога

Мы можем использовать функцию mkdir() для создания каталога. Мы можем использовать rmdir() для удаления пустого каталога. Если есть файлы, то мы должны сначала удалить их, а затем удалить каталог.

9. Изменить режим файла

10. Получение файловой группы и имени владельца

11. Разверните

до канонического пути

12. CWD и домашний путь

13. Соединение двух путей

14. Создание пустого файла

Как и в команде Touch в Unix, в Path есть функция touch() для создания пустого файла. У вас должны быть разрешения на создание файла. В противном случае файл не будет создан и ошибки не возникнет.

Создание нового файла

Заключение

Модуль pathlib в Python очень полезен при объектно-ориентированной работе с файлами и каталогами. Слабосвязанный и независимый от платформы код делает его более привлекательным в использовании.

Читайте также: