Python копирование файлов в сетевую папку

Обновлено: 05.07.2024

У меня на локальном компьютере есть текстовый файл, который генерируется ежедневным скриптом Python, запускаемым в cron.

Я хотел бы добавить немного кода для безопасной отправки этого файла на мой сервер через SSH.

Если вы хотите простой подход, это должно работать.

Сначала вы захотите ".close ()" файл, чтобы вы знали, что он записан на диск из Python.

Вам нужно сгенерировать (на исходном компьютере) и установить (на конечном компьютере) ключ ssh заранее, чтобы scp автоматически проходил аутентификацию с вашим открытым ключом ssh (другими словами, чтобы ваш скрипт не запрашивал пароль) ,

Чтобы сделать это в Python (то есть не оборачивая scp через subprocess.Popen или аналогичный) с библиотекой Paramiko , вы должны сделать что-то вроде этого:

(Возможно, вы захотите иметь дело с неизвестными хостами, ошибками, созданием любых необходимых каталогов и т.д.).

Возможно, вы бы использовали модуль подпроцесса . Что-то вроде этого:

Убедитесь, что вы установили правильные учетные данные, чтобы вы могли выполнить автоматическая scp без пароля между компьютерами . Существует вопрос stackoverflow для этого уже .

Есть несколько разных способов решения проблемы:

  1. Обтекание программ командной строки
  2. использовать библиотеку Python, которая предоставляет возможности SSH (например, - Paramiko или Twisted Conch )

У каждого подхода есть свои причуды. Вам нужно будет настроить ключи SSH для включения входа без пароля, если вы переносите системные команды, такие как «ssh», «scp» или «rsync». Вы можете встроить пароль в сценарий, используя Paramiko или какую-либо другую библиотеку, но вы можете столкнуться с недостатком документации, особенно если вы не знакомы с основами SSH-соединения (например, обмен ключами, агенты и т.д.). Вероятно, само собой разумеется, что ключи SSH почти всегда лучше, чем пароли для такого рода вещей.

ПРИМЕЧАНИЕ: rsync трудно победить, если вы планируете передавать файлы через SSH, особенно если альтернативой является старый scp.

Я использовал Paramiko, стараясь заменить системные вызовы, но обнаружил, что возвращаюсь к упакованным командам из-за их простоты использования и непосредственного знакомства. Вы можете быть другим. Я дал Кончу некоторое время назад, но это не обращалось ко мне.

Когда дело доходит до использования Python для копирования файлов, есть два основных способа: использовать модуль shutil или модуль os. Все методы ОС, которые мы здесь показываем, являются методами, которые позволяют нам выполнять команды из нашего кода, который мы будем использовать для выполнения команды копирования (Windows) или команды cp (Unix).

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

С помощью модуля shutil

Модуль shutil предлагает несколько высокоуровневых методов копирования файлов. Вот основные из них:

copyfile

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

Синтаксис этого метода:

Например, следующий код скопирует файл с именем file1.txt в файл с именем file2.txt:

Одна интересная и потенциально полезная функция shutil.copyfile – логический аргумент follow_symlinks. Если установлено значение False и исходный файл является символической ссылкой, то вместо копирования файла будет создана новая символическая ссылка.

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

Каждый из этих параметров такой же, как и в методе copyfile. Например, следующий код скопирует «file1.txt» в «file3.txt».

copy2

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

Опять же, эти параметры такие же, как и в предыдущих командах, которые мы уже упоминали.

Например, следующий код скопирует «file1.txt» в «file4.txt», а также сохранит метаданные исходного файла «file1.txt».

Как видно из выполнения нашего кода выше, «file1.txt» был скопирован в «file4.txt». Однако вы могли заметить, что дата создания была сохранена в новом файле, в отличие от shutil.copy, который копирует «file1.txt» в «file3.txt» и дает ему новую дату создания.

copyfileobj

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

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

Как мы видим, чтобы использовать copyfileobj, нам нужно открыть файлы в двоичном режиме (который является частью «b» от «rb» и «wb»). Кроме того, исходный файл должен быть открыт, как доступный для чтения, а целевой файл должен быть открыт, как доступный для записи (части «r» и «w» соответственно).

С помощью модуля os

Модуль os предоставляет возможность использовать функциональные возможности операционной системы для копирования ваших файлов. Мы приведем примеры, которые работают как для Windows, так и для Unix. Они различаются из-за используемых команд оболочки, поэтому не забудьте обратить внимание на то, как каждый вызов функции помечен в комментариях Python.

popen

Этот метод открывает канал к вашей команде. Однако обратите внимание, что этот метод устарел в Python 2.6, поэтому мы не рекомендуем его использовать, если в этом нет необходимости. В качестве альтернативы документация Python советует нам использовать вместо этого методы из модуля подпроцесса.

Здесь возвращаемое значение представляет собой файловый объект, подключенный к каналу. Этот объект может быть прочитан или записан в зависимости от режима. По умолчанию установлен режим «r», который позволяет читать содержимое файла.

В приведенном ниже примере файл file1.txt будет скопирован в file6.txt:

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

system

Этот метод выполняет указанную команду в подоболочке. Он доступен как для Unix, так и для Windows. Синтаксис следующий:

Здесь команда – это строка, содержащая команду оболочки DOS или Unix. В нашем случае сюда мы поместим команду copy или cp.

Например, следующий код скопирует file1.txt в file7.txt.

Это выглядит идентично предыдущей команде os.popen, которую мы только что использовали, но команда выполняется в подоболочке, что означает, что она выполняется в отдельном потоке параллельно с вашим исполняемым кодом. Чтобы дождаться его завершения, вам нужно вызвать .wait() для объекта, возвращаемого os.system.

С помощью модуля subprocess

Модуль subprocess предназначен для замены некоторых методов в модуле os (в частности, методов os.system и os.spawn *), и он представляет два основных метода доступа к командам операционной системы. Это методы call и check_output. Еще раз, для систем Unix команду «copy file1.txt file2.txt» следует заменить на «cp file1.txt file2.txt».

call Method

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

Параметр args будет включать нашу команду оболочки. Однако небольшое предостережение, поскольку документация Python предупреждает нас, что использование shell = True может быть угрозой безопасности.

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

Как показывает пример выше, нам просто нужно передать строку с помощью команды оболочки, как и раньше.

Как и ожидалось, операционная система скопирует file1.txt в файл с именем file8.txt.

Метод check_output

Здесь параметр args включает команду оболочки, которую мы хотим использовать. Еще раз, документация Python предупреждает нас об использовании shell = True, поэтому используйте этот метод с осторожностью.

В следующем коде мы скопируем «file1.txt» в «file9.txt» с помощью команды check_output:

И, как и все команды, которые мы показали в этой статье, это скопирует файл «file1.txt» в указанное нами место назначения.

Заключение

Python предлагает нам множество различных способов копирования файлов, некоторые из которых являются частью набора методов. Другие используют некоторые мощные методы для выполнения команд в оболочке, которые используют команды copy или cp.

В этом руководстве мы рассмотрим, как использовать FTP с Python для отправки и получения файлов с сервера через соединения TCP / IP .

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

Что такое FTP?

FTP обозначает протокол передачи файлов; он основан на архитектуре модели клиент-сервер и широко используется. Имеет два канала; командный канал и канал данных. Командный канал используется для управления связью, а канал данных используется для фактической передачи файлов. С помощью FTP вы можете делать множество вещей, таких как перемещение, загрузка, копирование файлов и т.д. Мы обсудим это в следующем разделе, а также подробно расскажем, как это сделать с помощью Python.

Работа с FTP в Python

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

После этого нам нужно установить соединение с FTP-сервером, с которым мы хотим открыть канал связи. Для этого создайте экземпляр ftp :

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

Теперь, когда мы установили соединение с сервером, мы хотим перейти к каталогу, в котором мы хотим выполнить операции, т.е. получить или записать файл. Для этого мы изменим «текущий рабочий каталог», используя следующую команду:

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

В приведенном выше вызове retrbinary 1024 означает, что файл будет загружен блоками по 1024 байта, пока не будет передан весь файл.

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

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

В приведенных выше примерах «rb» и «wb» означают «чтение двоичного файла» и «запись двоичного файла» соответственно.

Дополнительные функции FTP

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

Список файлов и каталогов

Чтобы просмотреть файлы и папки в текущем рабочем каталоге, в виде списка, выполните команду retrlines :

Создать новый каталог

Чтобы организовать ваши файлы определенным образом, вам может потребоваться создать новый каталог на сервере, что можно сделать с помощью одной строки кода:

Путь будет тем местом, в котором вы хотите разместить новый каталог.

Удалить файл с сервера

Проверить текущий путь

Чтобы проверить текущий путь, просто запустите следующий код:

Эта команда вернет абсолютный путь к текущему рабочему каталогу.

Важно отметить, что, хотя FTP сам по себе достаточно безопасен, он обычно не используется для передачи конфиденциальной информации; если вы передаете что-то подобное, вам следует использовать более безопасные опции, такие как SFTP (Secure FTP) или SSH (Secure Shell). Это наиболее часто используемые протоколы для обработки конфиденциальных данных.

Заключение

В этом посте мы обсудили, что такое FTP и как он работает, с помощью различных примеров. Мы также увидели, как использовать модуль Python «ftplib» для связи с удаленным сервером по FTP, и увидели некоторые другие функции, которые предлагает этот модуль. В конце мы также обсудили некоторые более безопасные альтернативы FTP, такие как SFTP и SSH, которые используются для передачи конфиденциальной информации.

Для получения дополнительной информации об использовании FTP с Python см. Официальную документацию по ftplib или RFC 959 .

Эй! В этом уроке мы узнаем о функциях, присутствующих в модуле shutil Python. Итак, давайте начнем.

Эй! В этом уроке мы узнаем о функциях, присутствующих в модуле shutil Python. Итак, давайте начнем.

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

Как скопировать файлы с помощью модуля shutil?

В модуле shutil доступны различные методы копирования содержимого одного файла в другой файл.

1. shutil.copyfileobj(src,dst)

Предположим, мы хотим скопировать содержимое файла data.txt кому data1.txt , мы можем использовать следующий фрагмент кода:

2. shutil.copy(src,dst)

Другой способ копирования данных из одного файла в другой может быть без создания объекта file. Здесь мы передаем относительный путь к нашим файлам.

3. shutil.copy2(src,dst)

функции copy (src,dst) и copy2(src,dst) почти одинаковы, но copy2(src,dst) также копирует метаданные исходного файла.

Метаданные включают информацию о том, когда файл был создан, доступен или изменен.

4. shutil.copyfile(src,dst)

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

5. shutil.move(src,dst)

Предположим, мы хотим удалить файл из одного места и переместить его в другое место. Вот, давайте двигаться shutil.py из источника в другое место:

6. shutil.copytree(src,dst)

Если мы хотим скопировать полную папку, содержащую все ее файлы, в новое место, мы можем использовать функцию copytree(src,dst ).

Он рекурсивно копирует все дерево каталогов с корнем в src в каталог с именем dst и возвращает каталог назначения.

Давайте скопируем папку Python в папку Новая папка .

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

Итак, здесь мы создали папку python 1 внутри папки Новая папка .

Как удалить/удалить файлы с помощью модуля shutil?

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

Используя shutil.rmtree() , мы можем удалить любую папку,файл или каталог. Давайте удалим папку Python .

Как скопировать биты разрешений из одного файла в другой?

Копирование файла-это одна часть. Что делать, если вы просто хотите скопировать те же разрешения файла во все другие файлы? Давайте научимся делать именно это, используя модуль shutil здесь.

1. shutil.copymode(src,dst)

Этот метод копирует биты разрешений из src в dst. Давайте скопируем биты разрешений из каталога Python в каталог Python 1 .

2. shutil.copystat(src,dst)

shutil.copystat(src.dst) копирует биты разрешений вместе с метаданными.

Другие функции в модуле shutil

Теперь давайте рассмотрим различные функции модуля shutil.

1. shutil.disk_usage(путь)

функция shutil.disk_usage(path) возвращает статистику использования диска по заданным именам путей в виде кортежа с атрибутами total , который представляет собой общий объем памяти, used , который является используемым пространством и free , который является свободным пространством в байтах.

2. шутил.который()

шутил.функция which() возвращает путь к исполняемому приложению, которое запустилось бы, если бы была вызвана данная команда cmd.

Вывод

В этом уроке мы рассмотрели, как мы можем копировать, удалять и работать с другими операциями над файлами и папками с помощью модуля shutil в python. Надеюсь, вам всем понравилось. Оставайтесь с нами!

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