Работа с файлами и каталогами с помощью Python

7 января 2018

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

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

Готов? Давайте перейдем к делу и начнем делать интересные вещи с нашими файлами и каталогами, используя Python!

shutil

shutil (Shell Utilities) - это имя модуля, который мы будем использовать в этом учебнике для выполнения различных операций с файлами и каталогами. shutil уже поставляется с вашей установкой Python, поэтому вам не нужно вручную устанавливать его. Чтобы использовать этот модуль, все, что вам нужно сделать, это импортировать модуль:

import shutil

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

Начнем с нашей первой операции, то есть копирования файлов. Для этого мы будем использовать функцию copy () из модуля shutil. Я собираюсь использовать файл sample.pdf в примерах этого учебника. Вы можете свободно загрузить этот файл или использовать любой файл, который вам нравится.

Следующий простой скрипт покажет вам, как скопировать sample.pdf с рабочего стола (где он изначально находится) в другой каталог Temp, который также находится на рабочем столе:

import shutil
shutil.copy('sample.pdf', 'Temp')

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

shutil.copy('/Users/Abder/Desktop/sample.pdf', '/Users/Abder/Desktop/Temp')

Вперед, откройте каталог Temp или любой указанный вами каталог, и вы должны найти там скопированный файл!

Что делать, если вторым аргументом был файл вместо каталога? Другими словами, допустим, вы набрали следующее (я удалил полный путь к файлам, предполагая, что они оба находятся на рабочем столе):

import shutil
shutil.copy('sample.pdf', 'file.pdf')

В этом случае у вас будет новый файл file.pdf, который является копией исходного файла sample.pdf. Таким образом, если вы откроете файл file.pdf, вы заметите, что он имеет тот же контент, потому что на самом деле это экземпляр sample.pdf.

Может ли источник и пункт назначения быть одинаковым? Попробуем посмотреть.

shutil.copy ('sample.pdf', 'sample.pdf')

Кажется, что эта операция приведет к ошибке, поскольку имена файлов не должны быть одинаковыми:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    shutil.copy('sample.pdf', 'sample.pdf')
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 119, in copy
    copyfile(src, dst)
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 69, in copyfile
    raise Error("`%s` and `%s` are the same file" % (src, dst))
shutil.Error: `sample.pdf` and `sample.pdf` are the same file

Копирование каталогов

В этом разделе мы увидим, как мы можем скопировать целый каталог (папку), а не один файл, как мы видели в предыдущем разделе.

Предположим, у нас есть следующая структура каталогов, которую мы хотим скопировать. То есть у нас есть основной каталог Original, который содержит каталог Original-1, который содержит каталог Original-2 и который содержит каталог Original-3, а в Original-3 у нас есть наш файл Sample.pdf (phew...).

Теперь мы хотим скопировать каталог Original со всем содержимым в новый каталог и вызвать этот новый каталог Original-Copy.

Это можно сделать просто с помощью функции copytree (), как показано ниже (при условии, что все происходит на рабочем столе):

import shutil
shutil.copytree('Original', 'Original-Copy')

Теперь вы должны найти новый каталог Original-Copy со всем содержимым и структурой оригинала.

Перемещение файлов

Перемещение файла походит на создание операции вырезания в файле. В разделе «Копирование файлов» мы увидели, как сделать копию файла, сохраняя исходный файл в исходном местоположении.

В этом разделе мы увидим, как перемещать (вырезать) файл в новое место, одновременно удаляя его из исходного местоположения. Эта операция выполняется просто с помощью функции move ():

import shutil
shutil.move('Sample.pdf', 'Temp')

Обратите внимание, что Sample.pdf был перемещен в каталог Temp и больше не существует на рабочем столе.

Что делать, если мы переместили Sample.pdf в новый файл New-Sample.pdf следующим образом?

import shutil
shutil.move('Sample.pdf', 'New-Sample.pdf')

В этом случае у вас будет только New-Sample.pdf с тем же содержимым, что и Sample.pdf, но Sample.pdf больше не существует.

Перемещение каталогов

Перемещение каталогов выполняется с использованием той же функции, что и в разделе «Перемещение файлов», то есть move (). Давайте используем тот же пример, что и в разделе «Копирование каталогов», но теперь с помощью функции move ().

import shutil
shutil.move('Original', 'Original-Copy')

В этом случае у вас будет новый каталог Original-Copy с тем же содержимым, что и оригинал, но оригинал больше не существует.

Переименование файлов и каталогов

Угадайте, что? Вы также можете использовать функцию move () для переименования файла или каталога. Я не буду повторять примеры снова в этом разделе. Но если вы заметили, что при применении функции move () в обоих файлах и каталогах выше, мы упоминали, что исходный каталог файлов больше не существует, но существует новый каталог файлов с тем же содержимым. Это похоже на переименование каталога файлов, не так ли?

Удаление файлов и каталогов

Кажется, что модуль shutil не содержит функции для удаления файлов. Однако он содержит функцию для удаления каталогов: rmtree (). Будьте осторожны, потому что удаление является постоянным, и поэтому вы не найдете удаленный каталог в своей корзине.

В приведенном ниже примере показано, как мы можем навсегда удалить каталог Original-Copy:

import shutil
shutil.rmtree('Original-Copy')

Если вы хотите окончательно удалить файл, вы можете использовать функцию remove () из os-модуля Python следующим образом:

import os
os.remove('Sample.pdf')

Заключение

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