Копирование файлов в Python примеры использования функций shutil copy и shutil copystat


Содержание материала:

Различия copy функций в shutil (python, python-3.x, shutil)

Есть библиотека Python3 shutil с методами:

  • copyfileobj
  • copyfile
  • copymode
  • copystat
  • copy
  • copy2
  • copytree
  • ignore_patterns

В чём разница между этими методами? Кратко, если не трудно объясните в какой ситуации каждый применяется?

Например не очень понятно как копируются метаданные без самого файла, куда именно? И наоборот файлы отдельно от метаданных, откуда тогда метаданные берутся?

Если нужно обычное копирование файла, то что из этого использовать?

Ответы (1)

(1) В чём разница между этими методами? Кратко если не трудно объясните в какой ситуации каждый применяется?

Если чтение документации shutil.copyfileobj() не достаточно для вас, то можно посмотреть на исходный код:

То есть: пытаемся прочитать кусок, заданной длины, из входного файла и если что-то прочитали, то пишем это в выходной файл, иначе завершаем цикл — всё. Можно использовать для копирования содержимого между любыми файло-подобными объектами (с методами read() , write() ).

copyfile() принимает пути, а не сами файлы (отсюда отличия). Если на входе пути к обычным файлам, то copyfile(src, dst) сводится к простому:

Открыли файлы, скопировали содержимое.

(2) Например не очень понятно как копируются метаданные без самого файла, куда именно? И наоборот файлы отдельно от метаданных, откуда тогда метаданные берутся?

copymode() , copystat() сводится к чтению метаданных исходного файла и применению их к выходному файлу (копирование режима доступа против копирования режима доступа + времени доступа/изменения + флаги, то есть просто chmod против utime + chmod + chflags + setxattr соответственно). Документация явно говорит, что конкретно должно быть скопировано.

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

Само содержимое файлов, кто владелец, группа, к которой файл принадлежит, не меняются этими функциями.

Когда явно не копируются метаданные, то используются значения по умолчанию (к примеру, может зависеть от значения umask).

(3) Если нужно обычное копирование файла, то что из этого использовать?

Это зависит от того какой смысл вы вкладываете в слова «обычное копирование».

copy() и copy2() это просто copyfile() вызов, за которым идёт copymode() и copystat() соответственно. Дополнительно, эти функции в отличии от copyfile() могут принимать папку куда писать.

Документация явно упоминает, что copy(src, dst) это cp src dst , а copy2(src, dst) это cp -p src dst . Вторая команда больше метаданных старается скопировать: разрешения на чтение/запись/исполнение, владелец, время модификации/доступа ( copy2() в отличии от cp -p не копирует владельца).

copytree() рекурсивно копирует всё дерево директорий, так что тяжело её перепутать с другими функциями. copytree() по умолчанию использует copy_function=copy2 для копирования обычных файлов.

ignore_patterns(*patterns) возвращает функцию, которая может быть использована в качестве значения ignore параметра при вызове copytree() ( ignore(src, names) функция возвращает те имена из names=os.listdir(src) , которые не должны копироваться из src директории, соответствующей текущему рекурсивному вызову). Полезно на примеры посмотреть:

source папка рекурсивно копируется в новую destination папку, игнорируя имена с расширением .pyc или начинающиеся на tmp (glob-шаблоны, как в командной строке).

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

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

Функция copyfile(Копируемый файл, путь куда копируем)

Функция copy(Копируемый файл, куда копируем)

Копирует файл вместе с его правами. В случае если файл уже существовал, он будет перезаписан. Неудачное копирование вызовет исключение IOError.

Сайт avi1.ru поможет Вам заказать платные лайки в Ютубе с очень большими оптовыми скидками. Торопитесь, пока действует предложение. Также на страницах данного сервиса Вы сможете найти все, что нужно для продвижения в Ютубе: подписчиков, просмотры и т. д.

Функция copy2(Копируемый файл, путь куда копируем)

Копирует файл вместе с его методанными. Если файл уже существует, он будет перезаписан.

Перемещение файла, функция move(путь к файлу, путь куда перемещать)

Копирует файл из указанного места, создает новый или перезаписывает уже существующий по новому пути. После выполнения копирования, копируемый файл удаляется. Бывает случай, что файл не удается удалить, в Windows возбуждается исключение WindowsError.

Летняя жара дает о себе знать, программируя нельзя концентрироваться из за сухого воздуха и душной обстановки. Решить данную проблему можно установив инверторные кондиционеры Mitsubishi у себя дома или в офисе. Сделайте себе и окружающим приятно.

эффективное использование Python Shutil Copy2

если мы посмотрим на функцию копирования файлов, то увидим, что есть несколько исключений, которые нужно обработать. Хороший пример здесь: http://msdn.microsoft.com/en-us/library/9706cfs5.aspx

мой вопрос: если я использую python shutil copy2, на что следует обратить внимание, чтобы справиться с различными исключениями (исходный файл не найден, доступ не авторизован и т. д.)?

что я должен сделать с вышеуказанной функцией?

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Возможно, вам просто нужно обработать IOError исключение, которое может быть вызвано из-за каких-либо разрешений или из-за неверного имени получателя.

copystat на папку до или после содержимого скопировать в shutil.copytree

Я использую shutil.copytree функцию в качестве шаблона для функции синхронизации каталога с некоторой дополнительной функциональностью и мне любопытно , о чем — то в том , как это написано.

Код ниже. Я нашел , что это интересно , что она делает copystat вызов родительской папки только после копирования всего содержимого файла. Есть случай , когда поставить copystat вызов перед основным циклом (например , сразу после os.makedirs(dst) ) приведет к чему — то плохому происходит?

Мой случай использования на Windows, в случае, если релевантно.

Как скопировать файл в Python?

Как скопировать файл в Python?

Я не мог найти ничего под os .

14 ответов

shutil есть много методов, которые вы можете использовать. Один из которых:

скопировать содержимое файла с именем src в файл с именем dst . Место назначения должно быть доступно для записи; в противном случае IOError исключение. Если dst уже существует, он будет заменен. Специальные файлы, такие как символьные или блочные устройства и трубы не могут быть скопированы с помощью этой функции. src и dst — Это имена путей, заданные в виде строк.

copy2(src,dst) часто более полезно, чем copyfile(src,dst) потому что:

  • позволяет dst быть каталог (вместо полного целевого имени файла), в этом случае имени of src используется для создания нового файла;
  • он сохраняет исходную информацию о модификации и доступе (mtime и atime) в метаданных файла (однако это происходит с небольшим надземный.)

вот краткий пример:

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

Если вы хотите скопировать по имени файла, вы можете сделать что-то вроде этого:

скопируйте содержимое файла с именем src в файл с именем dst. Место назначения должно быть доступно для записи; в противном случае будет вызвано исключение IOError. Если DST уже существует, он будет заменен. Специальные файлы, такие как символьные или блочные устройства и трубы не могут быть скопированы с помощью этой функции. src и dst-это имена путей, заданные в виде строк.

посмотри файловая система для всего файла и функции обработки каталогов, доступные в стандартных модулях Python.

shutil — High-level file operations¶

Source code: Lib/shutil.py

Even the higher-level file copying functions ( shutil.copy() , shutil.copy2() ) cannot copy all file metadata.

On POSIX platforms, this means that file owner and group are lost as well as ACLs. On Mac OS, the resource fork and other metadata are not used. This means that resources will be lost and file type and creator codes will not be correct. On Windows, file owners, ACLs and alternate data streams are not copied.

Directory and files operations¶

Copy the contents of the file-like object fsrc to the file-like object fdst. The integer length, if given, is the buffer size. In particular, a negative length value means to copy the data without looping over the source data in chunks; by default the data is read in chunks to avoid uncontrolled memory consumption. Note that if the current file position of the fsrc object is not 0, only the contents from the current file position to the end of the file will be copied.

Copy the contents (no metadata) of the file named src to a file named dst and return dst in the most efficient way possible. src and dst are path-like objects or path names given as strings.

dst must be the complete target file name; look at copy() for a copy that accepts a target directory path. If src and dst specify the same file, SameFileError is raised.

The destination location must be writable; otherwise, an OSError exception will be raised. If dst already exists, it will be replaced. Special files such as character or block devices and pipes cannot be copied with this function.

If follow_symlinks is false and src is a symbolic link, a new symbolic link will be created instead of copying the file src points to.

Changed in version 3.3: IOError used to be raised instead of OSError . Added follow_symlinks argument. Now returns dst.

Changed in version 3.4: Raise SameFileError instead of Error . Since the former is a subclass of the latter, this change is backward compatible.

Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to copy the file more efficiently. See Platform-dependent efficient copy operations section.

This exception is raised if source and destination in copyfile() are the same file.

New in version 3.4.

Copy the permission bits from src to dst. The file contents, owner, and group are unaffected. src and dst are path-like objects or path names given as strings. If follow_symlinks is false, and both src and dst are symbolic links, copymode() will attempt to modify the mode of dst itself (rather than the file it points to). This functionality is not available on every platform; please see copystat() for more information. If copymode() cannot modify symbolic links on the local platform, and it is asked to do so, it will do nothing and return.

Changed in version 3.3: Added follow_symlinks argument.

Copy the permission bits, last access time, last modification time, and flags from src to dst. On Linux, copystat() also copies the “extended attributes” where possible. The file contents, owner, and group are unaffected. src and dst are path-like objects or path names given as strings.

If follow_symlinks is false, and src and dst both refer to symbolic links, copystat() will operate on the symbolic links themselves rather than the files the symbolic links refer to—reading the information from the src symbolic link, and writing the information to the dst symbolic link.

Not all platforms provide the ability to examine and modify symbolic links. Python itself can tell you what functionality is locally available.

If os.chmod in os.supports_follow_symlinks is True , copystat() can modify the permission bits of a symbolic link.

If os.utime in os.supports_follow_symlinks is True , copystat() can modify the last access and modification times of a symbolic link.

If os.chflags in os.supports_follow_symlinks is True , copystat() can modify the flags of a symbolic link. ( os.chflags is not available on all platforms.)

On platforms where some or all of this functionality is unavailable, when asked to modify a symbolic link, copystat() will copy everything it can. copystat() never returns failure.

Please see os.supports_follow_symlinks for more information.

Changed in version 3.3: Added follow_symlinks argument and support for Linux extended attributes.

Copies the file src to the file or directory dst. src and dst should be strings. If dst specifies a directory, the file will be copied into dst using the base filename from src. Returns the path to the newly created file.

If follow_symlinks is false, and src is a symbolic link, dst will be created as a symbolic link. If follow_symlinks is true and src is a symbolic link, dst will be a copy of the file src refers to.

copy() copies the file data and the file’s permission mode (see os.chmod() ). Other metadata, like the file’s creation and modification times, is not preserved. To preserve all file metadata from the original, use copy2() instead.

Changed in version 3.3: Added follow_symlinks argument. Now returns path to the newly created file.

Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to copy the file more efficiently. See Platform-dependent efficient copy operations section.

> copy() except that copy2() also attempts to preserve file metadata.

When follow_symlinks is false, and src is a symbolic link, copy2() attempts to copy all metadata from the src symbolic link to the newly-created dst symbolic link. However, this functionality is not available on all platforms. On platforms where some or all of this functionality is unavailable, copy2() will preserve all the metadata it can; copy2() never raises an exception because it cannot preserve file metadata.

copy2() uses copystat() to copy the file metadata. Please see copystat() for more information about platform support for modifying symbolic link metadata.

Changed in version 3.3: Added follow_symlinks argument, try to copy extended file system attributes too (currently Linux only). Now returns path to the newly created file.

Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to copy the file more efficiently. See Platform-dependent efficient copy operations section.

This factory function creates a function that can be used as a callable for copytree() ’s ignore argument, ignoring files and directories that match one of the glob-style patterns provided. See the example below.

shutil. copytree ( src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False ) В¶

Recursively copy an entire directory tree rooted at src to a directory named dst and return the destination directory. dirs_exist_ok dictates whether to raise an exception in case dst or any missing parent directory already exists.

If symlinks is true, symbolic links in the source tree are represented as symbolic links in the new tree and the metadata of the original links will be copied as far as the platform allows; if false or omitted, the contents and metadata of the linked files are copied to the new tree.

Топ-пост этого месяца:  Основы CSS. Урок 9. Float, Clear, Display

When symlinks is false, if the file pointed by the symlink doesn’t exist, an exception will be added in the list of errors raised in an Error exception at the end of the copy process. You can set the optional ignore_dangling_symlinks flag to true if you want to silence this exception. Notice that this option has no effect on platforms that don’t support os.symlink() .

If ignore is given, it must be a callable that will receive as its arguments the directory being visited by copytree() , and a list of its contents, as returned by os.listdir() . Since copytree() is called recursively, the ignore callable will be called once for each directory that is copied. The callable must return a sequence of directory and file names relative to the current directory (i.e. a subset of the items in its second argument); these names will then be ignored in the copy process. ignore_patterns() can be used to create such a callable that ignores names based on glob-style patterns.

If exception(s) occur, an Error is raised with a list of reasons.

If copy_function is given, it must be a callable that will be used to copy each file. It will be called with the source path and the destination path as arguments. By default, copy2() is used, but any function that supports the same signature (like copy() ) can be used.

Raises an auditing event shutil.copytree with arguments src , dst .

Changed in version 3.3: Copy metadata when symlinks is false. Now returns dst.

Changed in version 3.2: Added the copy_function argument to be able to provide a custom copy function. Added the ignore_dangling_symlinks argument to silent dangling symlinks errors when symlinks is false.

Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to copy the file more efficiently. See Platform-dependent efficient copy operations section.

New in version 3.8: The dirs_exist_ok parameter.

Delete an entire directory tree; path must point to a directory (but not a symbolic link to a directory). If ignore_errors is true, errors resulting from failed removals will be ignored; if false or omitted, such errors are handled by calling a handler specified by onerror or, if that is omitted, they raise an exception.

On platforms that support the necessary fd-based functions a symlink attack resistant version of rmtree() is used by default. On other platforms, the rmtree() implementation is susceptible to a symlink attack: given proper timing and circumstances, attackers can manipulate symlinks on the filesystem to delete files they wouldn’t be able to access otherwise. Applications can use the rmtree.avoids_symlink_attacks function attribute to determine which case applies.

If onerror is provided, it must be a callable that accepts three parameters: function, path, and excinfo.

The first parameter, function, is the function which raised the exception; it depends on the platform and implementation. The second parameter, path, will be the path name passed to function. The third parameter, excinfo, will be the exception information returned by sys.exc_info() . Exceptions raised by onerror will not be caught.

Raises an auditing event shutil.rmtree with argument path .

Changed in version 3.3: Added a symlink attack resistant version that is used automatically if platform supports fd-based functions.

Changed in version 3.8: On Windows, will no longer delete the contents of a directory junction before removing the junction.

Indicates whether the current platform and implementation prov > rmtree() . Currently this is only true for platforms supporting fd-based directory access functions.

New in version 3.3.

Recursively move a file or directory (src) to another location (dst) and return the destination.

If the destination is on the current filesystem, then os.rename() is used. Otherwise, src is copied to dst using copy_function and then removed. In case of symlinks, a new symlink pointing to the target of src will be created in or as dst and src will be removed.

If copy_function is given, it must be a callable that takes two arguments src and dst, and will be used to copy src to dest if os.rename() cannot be used. If the source is a directory, copytree() is called, passing it the copy_function() . The default copy_function is copy2() . Using copy() as the copy_function allows the move to succeed when it is not possible to also copy the metadata, at the expense of not copying any of the metadata.

Changed in version 3.3: Added explicit symlink handling for foreign filesystems, thus adapting it to the behavior of GNU’s mv. Now returns dst.

Changed in version 3.5: Added the copy_function keyword argument.

Changed in version 3.8: Platform-specific fast-copy syscalls may be used internally in order to copy the file more efficiently. See Platform-dependent efficient copy operations section.

Return disk usage statistics about the given path as a named tuple with the attributes total, used and free, which are the amount of total, used and free space, in bytes. path may be a file or a directory.

New in version 3.3.

Changed in version 3.8: On Windows, path can now be a file or directory.

Change owner user and/or group of the given path.

user can be a system user name or a uid; the same applies to group. At least one argument is required.

See also os.chown() , the underlying function.

New in version 3.3.

Return the path to an executable which would be run if the given cmd was called. If no cmd would be called, return None .

mode is a permission mask passed to os.access() , by default determining if the file exists and executable.

When no path is specified, the results of os.environ() are used, returning either the “PATH” value or a fallback of os.defpath .

On Windows, the current directory is always prepended to the path whether or not you use the default or prov > PATHEXT environment variable is checked. For example, if you call shutil.which(«python») , which() will search PATHEXT to know that it should look for python.exe within the path directories. For example, on Windows:

New in version 3.3.

Changed in version 3.8: The bytes type is now accepted. If cmd type is bytes , the result type is also bytes .

This exception collects exceptions that are raised during a multi-file operation. For copytree() , the exception argument is a list of 3-tuples (srcname, dstname, exception).

Platform-dependent efficient copy operations¶

Starting from Python 3.8 all functions involving a file copy ( copyfile() , copy() , copy2() , copytree() , and move() ) may use platform-specific “fast-copy” syscalls in order to copy the file more efficiently (see bpo-33671). “fast-copy” means that the copying operation occurs within the kernel, avo > outfd.write(infd.read()) ”.

On macOS fcopyfile is used to copy the file content (not metadata).

On Linux os.sendfile() is used.

On Windows shutil.copyfile() uses a bigger default buffer size (1 MiB instead of 64 KiB) and a memoryview() -based variant of shutil.copyfileobj() is used.

If the fast-copy operation fails and no data was written in the destination file then shutil will silently fallback on using less efficient copyfileobj() function internally.

Changed in version 3.8.

copytree example¶

This example is the implementation of the copytree() function, described above, with the docstring omitted. It demonstrates many of the other functions provided by this module.

Another example that uses the ignore_patterns() helper:


This will copy everything except .pyc files and files or directories whose name starts with tmp .

Another example that uses the ignore argument to add a logging call:

rmtree example¶

This example shows how to remove a directory tree on Windows where some of the files have their read-only bit set. It uses the onerror callback to clear the readonly bit and reattempt the remove. Any subsequent failure will propagate.

Archiving operations¶

New in version 3.2.

Changed in version 3.5: Added support for the xztar format.

shutil. make_archive ( base_name, format [ , root_dir [ , base_dir [ , verbose [ , dry_run [ , owner [ , group [ , logger ] ] ] ] ] ] ] ) В¶

Create an archive file (such as zip or tar) and return its name.

base_name is the name of the file to create, including the path, minus any format-specific extension. format is the archive format: one of “zip” (if the zlib module is available), “tar”, “gztar” (if the zlib module is available), “bztar” (if the bz2 module is available), or “xztar” (if the lzma module is available).

root_dir is a directory that will be the root directory of the archive; for example, we typically chdir into root_dir before creating the archive.

base_dir is the directory where we start archiving from; i.e. base_dir will be the common prefix of all files and directories in the archive.

root_dir and base_dir both default to the current directory.

If dry_run is true, no archive is created, but the operations that would be executed are logged to logger.

owner and group are used when creating a tar archive. By default, uses the current owner and group.

logger must be an object compatible with PEP 282, usually an instance of logging.Logger .

The verbose argument is unused and deprecated.

Raises an auditing event shutil.make_archive with arguments base_name , format , root_dir , base_dir .

Changed in version 3.8: The modern pax (POSIX.1-2001) format is now used instead of the legacy GNU format for archives created with format=»tar» .

Return a list of supported formats for archiving. Each element of the returned sequence is a tuple (name, description) .

By default shutil provides these formats:

zip: ZIP file (if the zlib module is available).

tar: Uncompressed tar file. Uses POSIX.1-2001 pax format for new archives.

gztar: gzip’ed tar-file (if the zlib module is available).

bztar: bzip2’ed tar-file (if the bz2 module is available).

xztar: xz’ed tar-file (if the lzma module is available).

shutil. register_archive_format ( name, function [ , extra_args [ , description ] ] ) В¶

Register an archiver for the format name.

function is the callable that will be used to unpack archives. The callable will receive the base_name of the file to create, followed by the base_dir (which defaults to os.curdir ) to start archiving from. Further arguments are passed as keyword arguments: owner, group, dry_run and logger (as passed in make_archive() ).

If given, extra_args is a sequence of (name, value) pairs that will be used as extra keywords arguments when the archiver callable is used.

description is used by get_archive_formats() which returns the list of archivers. Defaults to an empty string.

shutil. unregister_archive_format ( name ) В¶

Remove the archive format name from the list of supported formats.

shutil. unpack_archive ( filename [ , extract_dir [ , format ] ] ) В¶

Unpack an archive. filename is the full path of the archive.

extract_dir is the name of the target directory where the archive is unpacked. If not provided, the current working directory is used.

Changed in version 3.7: Accepts a path-like object for filename and extract_dir.

Registers an unpack format. name is the name of the format and extensions is a list of extensions corresponding to the format, like .zip for Zip files.

function is the callable that will be used to unpack archives. The callable will receive the path of the archive, followed by the directory the archive must be extracted to.

When prov > (name, value) tuples that will be passed as keywords arguments to the callable.

shutil. unregister_unpack_format ( name ) В¶

Unregister an unpack format. name is the name of the format.

Return a list of all registered formats for unpacking. Each element of the returned sequence is a tuple (name, extensions, description) .

By default shutil provides these formats:

zip: ZIP file (unpacking compressed files works only if the corresponding module is available).

tar: uncompressed tar file.

gztar: gzip’ed tar-file (if the zlib module is available).

bztar: bzip2’ed tar-file (if the bz2 module is available).

xztar: xz’ed tar-file (if the lzma module is available).

Archiving example¶

In this example, we create a gzip’ed tar-file archive containing all files found in the .ssh directory of the user:

The resulting archive contains:

Querying the size of the output terminal¶

Get the size of the terminal window.

For each of the two dimensions, the environment variable, COLUMNS and LINES respectively, is checked. If the variable is defined and the value is a positive integer, it is used.

When COLUMNS or LINES is not defined, which is the common case, the terminal connected to sys.__stdout__ is queried by invoking os.get_terminal_size() .

If the terminal size cannot be successfully queried, either because the system doesn’t support querying, or because we are not connected to a terminal, the value given in fallback parameter is used. fallback defaults to (80, 24) which is the default size used by many terminal emulators.

The value returned is a named tuple of type os.terminal_size .

See also: The Single UNIX Specification, Version 2, Other Environment Variables.

Python | shutil.copy2() method

Shutil module in Python provides many functions of high-level operations on files and collections of files. It comes under Python’s standard utility modules. This module helps in automating process of copying and removal of files and directories.

shutil.copy2() method in Python is used to copy the content of source file to destination file or directory. This method is identical to shutil.copy() method but it also try to preserves the file’s metadata.

Source must represent a file but destination can be a file or a directory. If the destination is a directory then the file will be copied into destination using the base filename from source. Also, destination must be writable. If destination is a file and already exists then it will be replaced with the source file otherwise a new file will be created.

Syntax: shutil.copy2(source, destination, *, follow_symlinks = True)

Parameter:
source: A string representing the path of the source file.
destination: A string representing the path of the destination file or directory.
follow_symlinks (optional) : The default value of this parameter is True. If it is False and source represents a symbolic link then it attempts to copy all metadata from the source symbolic link to the newly-created destination symbolic link. This functionality is platform dependent.

Note: The ‘*’ in parameter list indicates that all following parameters (Here in our case ‘follow_symlinks’) are keyword-only parameters and they can be provided using their name, not as positional parameter.

Return Type: This method returns a string which represents the path of newly created file.

python shutil

Автор Bez shutok задал вопрос в разделе Другие языки и технологии

Копирование файлов в Питоне — отличие shutil.copyfile от shutil.copy и получил лучший ответ

Ответ от Андрей Чичивицин[новичек]
shutil.copyfile(src, dst) Copy the contents (no metadata) of the file named src to a file named dst. dst must be the complete target file name; look at shutil.copy() for a copy that accepts a target directory path. If src and dst are the same files, Error is raised. The destination location must be writable; otherwise, an IOError exception will be raised. If dst already exists, it will be replaced. Special files such as character or block devices and pipes cannot be copied with this function. src and dst are path names given as strings. shutil.copy(src, dst) Copy the file src to the file or directory dst. If dst is a directory, a file with the same basename as src is created (or overwritten) in the directory specified. Permission bits are copied. src and dst are path names given as strings.

Топ-пост этого месяца:  Статус Мало показов в Яндекс.Директ почему появился, что делать

спросили в Политика
Когда Путина будут переизбирать?
когда время придёт. интересно, а ваш обамка до перевыборов доживет?

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

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

— wxWidgest и интерфейс к этой библиотеке — wxPython . Наилучший выбор, если вы хотите, чтобы ваши приложения выглядели в любой ОС с любым графическим интерфейсом как родные. Самый большой минус на момент написания поста — недостаточно широкая документация. Впрочем, кто-то может с этим не согласиться.

— tkinter — Tk — самая простая и распространённая библиотека. Используется очень широко. Документация подробна и содержит всё необходимое для быстрого начала работы.

-PyQt — интерфейс к библиотеке Qt . Эта библиотека также переносима на Linux, Windows и MacOS. Хотя стоит отметить, что интерфейс программы, естественно, будет отличаться от “родных” приложений и только в случае со связкой Linux+KDE будет выглядеть как влитой. Тем не менее используется очень широко. Документация отличная. В написании кода, пожалуй, наиболее сложен.

PyGTK — как и предыдущий привязан к своей оконной системе. Не так распространён как три библиотеки, данные выше.

Разумеется, графических библиотек намного больше. Указанные здесь — основные. Автором рекомендуется выбирать между wxPython и Tkinter . Дабы использовать какую-либо библиотеку, нужно её установить (исключением является разве что OS Windows, где python, похоже, поставляется в чуть ли не полной комплектации). Разбираемый сегодня пример будет задействовать библиотеку tkinter и потребует установки модуля tk . Пользователи Linux могут найти его с помощью своего пакетного менеджера или собрать python с ключом tk (для gentoo).

Как это работает?

tkinter — программный слой поверх Tk , позволяющий сценариям на языке Python обращаться к библиотеке Tk , конструирующей и настраивающей интерфейсы и возвращающей управление обратно в сценарии Python, которые обрабатывают события, генерируемые пользователем (например, щелчки мышью). Таким образом, обращения к графическому интерфейсу из сценария Python направляются в tkinter, а затем в Tk; события, возникающие в графическом интерфейсе, направляются из Tk в tkinter, а затем обратно в сценарий Python.

Марк Лутц — программирование на Python 4 изд. I том

Начали импорт

# pybackup.py # #! /usr/bin/env python # -*- coding: utf-8 -*- import os import shutil from tkinter.messagebox import * from tkinter.filedialog import *

модуль os представляет переносимый интерфейс к часто используемым службам операционной системы. Нами будет использован для указания пути (os.path);

shutil используется для таких операций над файлами как копирование, переименование, удаление;

импортирование модулей из tkinter.filedialog даст нам возможность вызывать диалоговые окна, из messagebox — создавать сообщения, уведомления для пользователя

Функция выбора директории для копирования, получение доступа к описанию функции.

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

При импорте модуля можно будет обратиться к ней, вызвав команду backup.savefiles.__doc__ — то есть имя_модуля.имя_функции.__описание__ :

>>> backup.savefiles.__doc__ «Ask where save your files»

Полученный нами в итоге модуль не предназначен для расширения или импортирования, тем не менее строки документации создавать всё же нужно.

Далее используется переменная dst, которая впоследствии примет значение указанной пользователем директории. Значение будет строковым. Здесь переменная сделана глобальной поскольку должна быть доступна и другим функциям.

dst = askdirectory() — запросит у пользователя выбор директории для сохранения файлов

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

Функция выбора файлов для бекапа и вложенная функция копирования выбранных файлов

def _selectfile (): «»»Select your files for backup»»» src = askopenfilenames () src = list (src ) print (type (src )) print (src ) def save (): «»»Save files»»» for listcopy in src : listname = os . path . join (listcopy ) shutil . copy (listname , dst ) print («Backup file is OK» ) save ()

askopenfilenames — выбрать файлы для копирования. Поскольку в итоге мы получим кортеж, а кортежи неизменяемы, сразу же конвертируем его в список: list(src) .

После выбора файлов вызывается функция для немедленного их копирования в указанную пользователем директорию. Для этого используется обход по списку и копирование с модулем shutil:

listname — файлы из списка

dst — куда копируем

Функция выбора директории и вложенная функция рекурсивного копирования

def _selectdirectory (): «»»Select your directory for backup»»» src2 = askdirectory () print (type (src2 )) print (src2 ) def save2 (): «»»Save directories and files»»» print («make backup » + src2 ) names = os . listdir (src2 ) if not os . path . exists (dst ): os . mkdir (dst ) for name in names : srcname = os . path . join (src2 , name ) dstname = os . path . join (dst , name ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print («Backup is OK» ) save2 ()

askdirectory — выбрать директорию для копирования. В функцию включена проверка для рекурсивного копирования поддиректорий. Если srcname — поддиректория (os.path.isdir), будет выполнено рекурсивное копирование (copytree). Если в выбранная директория помимо поддиректорий содержит обычные файлы (os.path.isfile), копирование этих файлов (copy).

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

os.path.join — “склеивает” пути

Функция, закрывающая программу

def close_win (): «»»Close window and exit programm»»» if askyesno («Exit» , «Do you want to quit?» ): root . destroy ()

Функция, показывающая информационное окно

def about (): showinfo («Backup» , «This is simple backup programm. \n (test version)» )

root = Tk () m = Menu (root ) root . config (menu = m ) fm = Menu (m ) m . add_cascade (label = «File» , menu = fm ) fm . add_command (label = «Select directory for save» , command = savefiles ) fm . add_command (label = «Select files for copy.» , command = _selectfile ) fm . add_command (label = «Select directories for copy» , command = _selectdirectory ) fm . add_command (label = «Exit» , command = close_win ) hm = Menu (m ) m . add_cascade (label = «Help» , menu = hm ) hm . add_command (label = «About» , command = about ) txt = Text (root , w ) txt . pack () root . mainloop ()

root = Tk() — создать главное окно

m = Menu(root) — создать меню, привязанное к главному окну

root.config(menu=m) — для создания списка в меню (add_cascade)

fm = Menu(m) — создание пунктов в списке

Всё дальнейшее просто: fm.add_command — вызовет указанное действие; label — метка, то, как будет называться пункт меню; command — указание на функцию, которая должна быть выполнена при нажатии пунтка меню; pack() — менеджер расположения. Он отвечает за то, как виджеты будут располагаться на главном окне.

root.mainloop() — специальный обязательный метод. Без него главное окно не появится.

Что не так?

Если вам понятен приведённый пример, вы уже можете сказать, чего в нём не хватает. Например, вы можете обнаружить, что при повторном копировании объектов одной и той же директории, замена файлов происходит, а замена поддиректорий — нет. Вам лишь укажут на тот факт, что такая поддиректория уже существует и выполнение программы прекратится. В качестве самостоятельной работы предлагается изучить конструкцию try-except или модуль errno и проработать этот момент. Например:

def save2 (): «»»Save directories»»» try : print («make backup » + src2 ) names = os . listdir (src2 ) if not os . path . exists (dst ): os . mkdir (dst ) for name in names : srcname = os . path . join (src2 , name ) dstname = os . path . join (dst , name ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print («Backup is OK» ) except OSError : shutil . rmtree (dstname ) print («Try again» ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print («Backup is OK» ) save2 ()

В Windows копирование файла/файлов работать не будет: сие есть последствие использования этой ОС не православных путей к файлам (обратный слэш). Возможно, пользователям Windows будет интересно изменить код таким образом, чтобы данная функция работала.

Кстати: чтобы программа в Windows запускалась при двойном клике, измените расширение на.pyw Кроме того, предлагается поупражняться с tkinter и выводить всплывающее окно “Wait, please!” во время копирования (наподобие того, как это сделано при закрытии программы).

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

Операции над файлами и директориями

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 . Функция возвращает путь к местонахождению нового скопированного файла.

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()).

Если False (по умолчанию), будут скопированы содержимое и метаданные файлов, на которые указывали ссылки.

Если symlinks=False , если файл, на который указывает ссылка, не существует, будет добавлено исключение в список ошибок, в исключении shutil.Error в конце копирования.

Можно установить флаг ignore_dangling_symlinks=True , чтобы скрыть данную ошибку.

Если ignore не None , то это должна быть функция, принимающая в качестве аргументов имя директории, в которой сейчас copytree() , и список содержимого, возвращаемый os.listdir() . Т.к. copytree() вызывается рекурсивно, ignore вызывается 1 раз для каждой поддиректории. Она должна возвращать список объектов относительно текущего имени директории (т.е. подмножество элементов во втором аргументе). Эти объекты не будут скопированы.

shutil.ignore_patterns (*patterns) — функция, которая создаёт функцию, которая может быть использована в качестве ignore для copytree() , игнорируя файлы и директории, которые соответствуют -style шаблонам.

copytree (source , destination , ignore = ignore_patterns («*.pyc» , «tmp*» )) # Скопирует все файлы, кроме заканчивающихся на.pyc или начинающихся с tmp

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) — возвращает статистику использования дискового пространства как с арибутами 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 . get_archive_formats () [(«bztar», «bzip2″ed tar-file»), («gztar», «gzip»ed tar-file»), («tar», «uncompressed tar file»), («xztar», «xz»ed tar-file»), («zip», «ZIP file»)]

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).

>>> shutil . get_terminal_size () os.terminal_size(columns=102, lines=29) >>> shutil . get_terminal_size () # Уменьшили окно os.terminal_size(columns=67, lines=17)

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

Функция copyfile(Копируемый файл, путь куда копируем)

Функция copy(Копируемый файл, куда копируем)

Копирует файл вместе с его правами. В случае если файл уже существовал, он будет перезаписан. Неудачное копирование вызовет исключение IOError.

Сайт avi1.ru поможет Вам заказать платные лайки в Ютубе с очень большими оптовыми скидками. Торопитесь, пока действует предложение. Также на страницах данного сервиса Вы сможете найти все, что нужно для продвижения в Ютубе: подписчиков, просмотры и т. д.

Функция copy2(Копируемый файл, путь куда копируем)

Копирует файл вместе с его методанными. Если файл уже существует, он будет перезаписан.

Перемещение файла, функция move(путь к файлу, путь куда перемещать)

Копирует файл из указанного места, создает новый или перезаписывает уже существующий по новому пути. После выполнения копирования, копируемый файл удаляется. Бывает случай, что файл не удается удалить, в Windows возбуждается исключение WindowsError.

Топ-пост этого месяца:  Ошибка JavaScript. Как найти и исправить ошибку JavaScript

Python копирование файлов без подключения модуля. Копирование файлов в Python. Операции над файлами и директориями

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

Операции над файлами и директориями

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 . Функция возвращает путь к местонахождению нового скопированного файла.

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()).

Если False (по умолчанию), будут скопированы содержимое и метаданные файлов, на которые указывали ссылки.

Если symlinks=False , если файл, на который указывает ссылка, не существует, будет добавлено исключение в список ошибок, в исключении shutil.Error в конце копирования.

Можно установить флаг ignore_dangling_symlinks=True , чтобы скрыть данную ошибку.

Если ignore не None , то это должна быть функция, принимающая в качестве аргументов имя директории, в которой сейчас copytree() , и список содержимого, возвращаемый os.listdir() . Т.к. copytree() вызывается рекурсивно, ignore вызывается 1 раз для каждой поддиректории. Она должна возвращать список объектов относительно текущего имени директории (т.е. подмножество элементов во втором аргументе). Эти объекты не будут скопированы.

shutil.ignore_patterns (*patterns) — функция, которая создаёт функцию, которая может быть использована в качестве ignore для copytree() , игнорируя файлы и директории, которые соответствуют -style шаблонам.

copytree (source , destination , ignore = ignore_patterns («*.pyc» , «tmp*» )) # Скопирует все файлы, кроме заканчивающихся на.pyc или начинающихся с tmp

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) — возвращает статистику использования дискового пространства как с арибутами 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 . get_archive_formats () [(«bztar», «bzip2″ed tar-file»), («gztar», «gzip»ed tar-file»), («tar», «uncompressed tar file»), («xztar», «xz»ed tar-file»), («zip», «ZIP file»)]

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).

>>> shutil . get_terminal_size () os.terminal_size(columns=102, lines=29) >>> shutil . get_terminal_size () # Уменьшили окно os.terminal_size(columns=67, lines=17)

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

— wxWidgest и интерфейс к этой библиотеке — wxPython . Наилучший выбор, если вы хотите, чтобы ваши приложения выглядели в любой ОС с любым графическим интерфейсом как родные. Самый большой минус на момент написания поста — недостаточно широкая документация. Впрочем, кто-то может с этим не согласиться.

— tkinter — Tk — самая простая и распространённая библиотека. Используется очень широко. Документация подробна и содержит всё необходимое для быстрого начала работы.

-PyQt — интерфейс к библиотеке Qt . Эта библиотека также переносима на Linux, Windows и MacOS. Хотя стоит отметить, что интерфейс программы, естественно, будет отличаться от “родных” приложений и только в случае со связкой Linux+KDE будет выглядеть как влитой. Тем не менее используется очень широко. Документация отличная. В написании кода, пожалуй, наиболее сложен.

PyGTK — как и предыдущий привязан к своей оконной системе. Не так распространён как три библиотеки, данные выше.

Разумеется, графических библиотек намного больше. Указанные здесь — основные. Автором рекомендуется выбирать между wxPython и Tkinter . Дабы использовать какую-либо библиотеку, нужно её установить (исключением является разве что OS Windows, где python, похоже, поставляется в чуть ли не полной комплектации). Разбираемый сегодня пример будет задействовать библиотеку tkinter и потребует установки модуля tk . Пользователи Linux могут найти его с помощью своего пакетного менеджера или собрать python с ключом tk (для gentoo).

Как это работает?

tkinter — программный слой поверх Tk , позволяющий сценариям на языке Python обращаться к библиотеке Tk , конструирующей и настраивающей интерфейсы и возвращающей управление обратно в сценарии Python, которые обрабатывают события, генерируемые пользователем (например, щелчки мышью). Таким образом, обращения к графическому интерфейсу из сценария Python направляются в tkinter, а затем в Tk; события, возникающие в графическом интерфейсе, направляются из Tk в tkinter, а затем обратно в сценарий Python.

Марк Лутц — программирование на Python 4 изд. I том

Начали импорт

# pybackup.py # #! /usr/bin/env python # -*- coding: utf-8 -*- import os import shutil from tkinter.messagebox import * from tkinter.filedialog import *

модуль os представляет переносимый интерфейс к часто используемым службам операционной системы. Нами будет использован для указания пути (os.path);

shutil используется для таких операций над файлами как копирование, переименование, удаление;

импортирование модулей из tkinter.filedialog даст нам возможность вызывать диалоговые окна, из messagebox — создавать сообщения, уведомления для пользователя

Функция выбора директории для копирования, получение доступа к описанию функции.

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

При импорте модуля можно будет обратиться к ней, вызвав команду backup.savefiles.__doc__ — то есть имя_модуля.имя_функции.__описание__ :

>>> backup.savefiles.__doc__ «Ask where save your files»

Полученный нами в итоге модуль не предназначен для расширения или импортирования, тем не менее строки документации создавать всё же нужно.

Далее используется переменная dst, которая впоследствии примет значение указанной пользователем директории. Значение будет строковым. Здесь переменная сделана глобальной поскольку должна быть доступна и другим функциям.

dst = askdirectory() — запросит у пользователя выбор директории для сохранения файлов

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

Функция выбора файлов для бекапа и вложенная функция копирования выбранных файлов

def _selectfile (): «»»Select your files for backup»»» src = askopenfilenames () src = list (src ) print (type (src )) print (src ) def save (): «»»Save files»»» for listcopy in src : listname = os . path . join (listcopy ) shutil . copy (listname , dst ) print («Backup file is OK» ) save ()

askopenfilenames — выбрать файлы для копирования. Поскольку в итоге мы получим кортеж, а кортежи неизменяемы, сразу же конвертируем его в список: list(src) .

После выбора файлов вызывается функция для немедленного их копирования в указанную пользователем директорию. Для этого используется обход по списку и копирование с модулем shutil:

listname — файлы из списка

dst — куда копируем

Функция выбора директории и вложенная функция рекурсивного копирования

def _selectdirectory (): «»»Select your directory for backup»»» src2 = askdirectory () print (type (src2 )) print (src2 ) def save2 (): «»»Save directories and files»»» print («make backup » + src2 ) names = os . listdir (src2 ) if not os . path . exists (dst ): os . mkdir (dst ) for name in names : srcname = os . path . join (src2 , name ) dstname = os . path . join (dst , name ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print («Backup is OK» ) save2 ()

askdirectory — выбрать директорию для копирования. В функцию включена проверка для рекурсивного копирования поддиректорий. Если srcname — поддиректория (os.path.isdir), будет выполнено рекурсивное копирование (copytree). Если в выбранная директория помимо поддиректорий содержит обычные файлы (os.path.isfile), копирование этих файлов (copy).

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

os.path.join — “склеивает” пути

Функция, закрывающая программу

def close_win (): «»»Close window and exit programm»»» if askyesno («Exit» , «Do you want to quit?» ): root . destroy ()

Функция, показывающая информационное окно

def about (): showinfo («Backup» , «This is simple backup programm. \n (test version)» )

root = Tk () m = Menu (root ) root . config (menu = m ) fm = Menu (m ) m . add_cascade (label = «File» , menu = fm ) fm . add_command (label = «Select directory for save» , command = savefiles ) fm . add_command (label = «Select files for copy.» , command = _selectfile ) fm . add_command (label = «Select directories for copy» , command = _selectdirectory ) fm . add_command (label = «Exit» , command = close_win ) hm = Menu (m ) m . add_cascade (label = «Help» , menu = hm ) hm . add_command (label = «About» , command = about ) txt = Text (root , w ) txt . pack () root . mainloop ()

root = Tk() — создать главное окно

m = Menu(root) — создать меню, привязанное к главному окну

root.config(menu=m) — для создания списка в меню (add_cascade)

fm = Menu(m) — создание пунктов в списке

Всё дальнейшее просто: fm.add_command — вызовет указанное действие; label — метка, то, как будет называться пункт меню; command — указание на функцию, которая должна быть выполнена при нажатии пунтка меню; pack() — менеджер расположения. Он отвечает за то, как виджеты будут располагаться на главном окне.

root.mainloop() — специальный обязательный метод. Без него главное окно не появится.

Что не так?

Если вам понятен приведённый пример, вы уже можете сказать, чего в нём не хватает. Например, вы можете обнаружить, что при повторном копировании объектов одной и той же директории, замена файлов происходит, а замена поддиректорий — нет. Вам лишь укажут на тот факт, что такая поддиректория уже существует и выполнение программы прекратится. В качестве самостоятельной работы предлагается изучить конструкцию try-except или модуль errno и проработать этот момент. Например:

def save2 (): «»»Save directories»»» try : print («make backup » + src2 ) names = os . listdir (src2 ) if not os . path . exists (dst ): os . mkdir (dst ) for name in names : srcname = os . path . join (src2 , name ) dstname = os . path . join (dst , name ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print («Backup is OK» ) except OSError : shutil . rmtree (dstname ) print («Try again» ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print («Backup is OK» ) save2 ()

В Windows копирование файла/файлов работать не будет: сие есть последствие использования этой ОС не православных путей к файлам (обратный слэш). Возможно, пользователям Windows будет интересно изменить код таким образом, чтобы данная функция работала.

Кстати: чтобы программа в Windows запускалась при двойном клике, измените расширение на.pyw Кроме того, предлагается поупражняться с tkinter и выводить всплывающее окно “Wait, please!” во время копирования (наподобие того, как это сделано при закрытии программы).

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

Функция copyfile(Копируемый файл, путь куда копируем)

Функция copy(Копируемый файл, куда копируем)

Копирует файл вместе с его правами. В случае если файл уже существовал, он будет перезаписан. Неудачное копирование вызовет исключение IOError.

Сайт avi1.ru поможет Вам заказать платные лайки в Ютубе с очень большими оптовыми скидками. Торопитесь, пока действует предложение. Также на страницах данного сервиса Вы сможете найти все, что нужно для продвижения в Ютубе: подписчиков, просмотры и т. д.

Функция copy2(Копируемый файл, путь куда копируем)

Копирует файл вместе с его методанными. Если файл уже существует, он будет перезаписан.

Перемещение файла, функция move(путь к файлу, путь куда перемещать)

Копирует файл из указанного места, создает новый или перезаписывает уже существующий по новому пути. После выполнения копирования, копируемый файл удаляется. Бывает случай, что файл не удается удалить, в Windows возбуждается исключение WindowsError.

Добавить комментарий