Меню

Python как найти файл по имени

Find a file in python

I have a file that may be in a different place on each user’s machine. Is there a way to implement a search for the file? A way that I can pass the file’s name and the directory tree to search in?

9 Answers 9

os.walk is the answer, this will find the first match:

And this will find all matches:

And this will match a pattern:

In Python 3.4 or newer you can use pathlib to do recursive globbing:

In Python 3.5 or newer you can also do recursive globbing like this:

I used a version of os.walk and on a larger directory got times around 3.5 sec. I tried two random solutions with no great improvement, then just did:

While it’s POSIX-only, I got 0.25 sec.

From this, I believe it’s entirely possible to optimise whole searching a lot in a platform-independent way, but this is where I stopped the research.

If you are using Python on Ubuntu and you only want it to work on Ubuntu a substantially faster way is the use the terminal’s locate program like this.

search_results is a list of the absolute file paths. This is 10,000’s of times faster than the methods above and for one search I’ve done it was

If you are working with Python 2 you have a problem with infinite recursion on windows caused by self-referring symlinks.

This script will avoid following those. Note that this is windows-specific!

It returns a list with all paths that point to files in the filenames list. Usage:

Below we use a boolean «first» argument to switch between first match and all matches (a default which is equivalent to «find . -name file»):

The answer is very similar to existing ones, but slightly optimized.

So you can find any files or folders by pattern:

to search only files or only folders — replace “dirs + files”, for example, with only “dirs” or only “files”, depending on what you need.

SARose’s answer worked for me until I updated from Ubuntu 20.04 LTS. The slight change I made to his code makes it work on the latest Ubuntu release.

@F.M.F’s answers has a few problems in this version, so I made a few adjustments to make it work.

unicode() was changed to str() in Python 3, so I made that adjustment (line 8)

I also added (in line 25) and exception to PermissionError. This way, the program won’t stop if it finds a folder it can’t access.

Finally, I would like to give a little warning. When running the program, even if you are looking for a single file/directory, make sure you pass it as a list. Otherwise, you will get a lot of answers that not necessarily match your search.

but, for example: find(«C:\\», «Homework») will give un-wanted answers.

Источник статьи: http://stackoverflow.com/questions/1724693/find-a-file-in-python

Find Files Using Python

This tutorial will discuss the methods to find a file in Python.

Find File With the os.walk() Function in Python

If we want to find the path of a specific file on our machine with python, we can use the os module. The os module provides many os-related functionalities to our code. The os.walk() function takes a path string as an input parameter and gives us the directory path, the directory name, and the filename for each file in the path . The sample code below shows us how to find a file in Python with the os.walk() function.

In the above code, we declared the findfile() function that uses os.walk() function to find our file. The findfile() function takes the file’s name and the root path as input parameters and returns the path of our specified file. This approach gives us the absolute path of the file.

Find File With the glob.glob() Function in Python

We can also use the glob.glob() function to solve our current problem. The glob.glob() function takes a pathname as an input parameter and returns a list of all the file paths that match the input argument. We can specify a regular expression as an input parameter that matches our file only. The sample code below shows us how to find a file in Python with the glob.glob() function.

We passed our file name as the input parameter to the glob.glob() function, and it returned the relative path of our file. This method can give us the relative path as well as the absolute path of our file.

Find File With the Path.glob() Function in Python

Another approach is to use the pathlib module. This Python module offers classes that represent filesystem paths for different operating systems. We can use the Path.glob() function inside the pathlib module to solve our specific problem. This function is similar to the glob() function inside the glob module. The Path.glob() function takes a pattern as an input parameter and returns a list of path objects that match the input argument. The sample code snippet shows us how to find a file in Python with the pathlib module.

We passed a pattern string that matches our file to the Path.glob() function. The Path.glob() function returns us a list of WindowsPath objects that match the pattern. With this method, we get path objects specific to our operating system.

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

Источник статьи: http://www.delftstack.com/howto/python/python-find-file/

Найти файлы по части пути, не только по имени c Python

Как найти файлы полное имя которых заканчивается на ‘*/path/to/folder/myfile.ext’ ?

Не находит. Работает только по короткому имени файла.

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

2 ответа 2

glob() уже работает с частями путей:

Эта команда найдёт все файлы вида:

Если хочется найти path/to/folder/myfile.ext в любом месте дерева директорий, то можно использовать ** шаблон:

** должен быть отдельным компонентом пути.

В pathlib.Path есть .glob() и .rglob() методы соответственно:

как в общем случае найти файл по регулярному выражению полного имени (пути)?

Файловые шаблоны и регулярные выражения это разные вещи, например, если *.txt шаблон преобразовать в regex:

glob() работает с шаблонами. Если хочется работать с регулярными выражениями, то самостоятельно придётся генерировать пути, например, используя os.walk() как уже показал @Timofey Bondarev:

len(topdir): убирает родительскую директорию из пути (вложенные каталоги с / начинаются для целей regex).

В данном случае, если ОСь не различает регистры для файловых имён, то регулярное выражение должно это учитывать самостоятельно ( glob() автоматически это учитывает).

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

Если я правильно понял задачу, то вот код, который может помочь:

Здесь с помощью функции os.walk обходятся все файлы, находящиеся в каталоге root, подходящие под wildcard, сохранённый в pattern .

Проверка на то, подходит ли имя файла под pattern , выполняется с помощью функции fnmatch встроенного модуля fnmatch .

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

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

В документации к библиотеке fnmatch говорится также, что функция filter работает как код [n for n in names if fnmatch(n, pattern)] , но реализована более эффективно, поэтому можно сравнить скорость работы первого варианта с такой реализацией:

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

Пример использования

Обратите внимание, в этом коде учитывается вид разделителей каталогов: если передаётся pattern = r’code\*.py’ , то на linux ничего найдено не будет, так как для разделения каталогов используется символ / .

Источник статьи: http://ru.stackoverflow.com/questions/463862/%D0%9D%D0%B0%D0%B9%D1%82%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D0%BF%D0%BE-%D1%87%D0%B0%D1%81%D1%82%D0%B8-%D0%BF%D1%83%D1%82%D0%B8-%D0%BD%D0%B5-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BF%D0%BE-%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8-c-python

Python | Создание архивов и поиск файлов по имени

В этой статье мы узнаем, как создавать или распаковывать архивы в общих форматах (например, .tar, .tgz или .zip) с помощью модуля shutil.

Модуль shutil имеет две функции — make_archive() и unpack_archive() которые могут быть именно таким решением.

shutil.make_archive( ‘py33’ , ‘zip’ , ‘Python-3.3.0’ )

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

В Python есть другие библиотечные модули для работы с низкоуровневыми деталями различных форматов архивов (например, tarfile, zipfile, gzip, bz2 и т. Д.). Однако для создания или извлечения архива нет нужды идти на столь низкий уровень.
Вместо этого можно просто использовать эти высокоуровневые функции в shutil. Функции имеют множество дополнительных опций для регистрации, пробных прогонов, прав доступа к файлам и так далее.

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

Для поиска файлов используйте функцию os.walk () , предоставив ей каталог верхнего уровня.

Код № 3: функция, которая находит конкретное имя файла и печатает полный путь всех совпадений.

for relpath, dirs, files in os.walk(start):

full_path = os.path.join(start, relpath, name)

findfile(sys.argv[ 1 ], sys.argv[ 2 ])

Сохраните этот скрипт как abc.py и запустите его из командной строки, abc.py начальную точку и имя в качестве позиционных аргументов как —

Как это устроено ?

  • Метод os.walk() пересекает иерархию каталогов для нас, и для каждого каталога, в который он входит, он возвращает 3-кортеж, содержащий относительный путь к каталогу, который он проверяет, список, содержащий все имена каталогов в этом каталоге, и список имен файлов в этом каталоге.
  • Для каждого кортежа просто проверьте, находится ли целевое имя файла в списке файлов. Если это так, os.path.join() используется для составления пути.
  • Чтобы избежать возможности странно выглядящих путей, таких как ././foo//bar , для исправления результата используются две дополнительные функции.
  • Первым является os.path.abspath() , который принимает относительный путь и формирует абсолютный путь.
  • Второй — os.path.normpath() , который нормализует путь, os.path.normpath() проблемы с двойной косой чертой, множественными ссылками на текущий каталог и т. Д.

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

Код № 4: Функция, которая распечатывает все файлы, которые имеют время последнего изменения

Источник статьи: http://espressocode.top/python-create-archives-and-find-files-by-name/

Модуль Glob в Python и его функции

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

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

Что такое модуль Glob в Python?

С помощью модуля Python glob мы можем искать все имена путей, которые находят файлы, соответствующие определенному шаблону (который определен нами). Указанный шаблон для сопоставления файлов определяется в соответствии с правилами, продиктованными оболочкой Unix.

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

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

Функции сопоставления с образцом

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

В этом разделе мы обсудим следующие функции:

Первые две функции, представленные в приведенном выше списке, то есть функция fnmatch.fnmatch() и os.scandir(), фактически используются для выполнения задачи сопоставления с образцом, а не путем вызова вспомогательной оболочки в Python.

Эти две функции выполняют задачу сопоставления с образцом и получают список всех имен файлов в произвольном порядке. Вот уловка, которую модуль glob рассматривает как особые случаи для всех файлов, имена которых начинаются с точки(.), что очень маловероятно в функции fnmatch.fnmatch().

Последние две функции приведенные в списке, то есть функции os.path.expandvars() и os.path.expanduser() могут использоваться для расширения переменных оболочки и тильды в задаче сопоставления с образцом имени файла.

Правила шаблона

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

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

Ниже приведен набор правил для шаблона, который мы определяем в функциях сопоставления шаблонов модуля glob:

  • Мы должны следовать всем стандартным правилам расширения пути UNIX при сопоставлении с образцом.
  • Путь, который мы определяем внутри шаблона, должен быть либо абсолютным, либо относительным, и мы не можем определить какой-либо нечеткий путь внутри шаблона.
  • В шаблоне можно использовать только два специальных символа, например, «*,?». а обычные символы, которые могут быть выражены внутри шаблона, выражаются в [].
  • Правила шаблона для функций модуля glob применяются к сегменту имени файла (который предоставляется в функциях), и он останавливается на разделителе пути, то есть на ‘/’ файлов.

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

Приложения Glob Module

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

Ниже приведены некоторые перечисленные приложения модуля Python glob, и мы можем использовать этот модуль в данных функциях:

  1. Иногда нам нужно найти файл с определенным префиксом в имени, любой обычной строкой в середине имен многих файлов или с таким же определенным расширением. Теперь, чтобы выполнить эту задачу, нам, возможно, придется написать код, который будет сканировать весь каталог, а затем выдаст результат. Вместо него в этом случае будет очень полезен модуль glob, так как мы можем использовать функции модуля glob и выполнять эту задачу очень легко и экономить наше время.
  2. Помимо этого, модуль Glob также очень полезен, когда одна из наших программ должна искать список всех файлов в данной файловой системе с именами файлов, соответствующих аналогичному шаблону. Модуль Glob может легко выполнить эту и ту же задачу, не открывая результат программы в другой суб-оболочке.

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

Функции модуля Glob

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

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

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

Ниже приводится синтаксис для использования функции iglob() модуля glob внутри программы Python:

Как мы видим в синтаксисе функции iglob(), она принимает в общей сложности три параметра, которые можно определить, как указано ниже:

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

(ii) recursive: это также необязательный параметр для функции iglob(), и он принимает в нем только логические значения (true или false). Рекурсивный параметр используется, чтобы установить, следует ли функция рекурсивному подходу для поиска имен файлов или нет.

(iii) ‘*’: это обязательный параметр функции iglob(), поскольку здесь мы должны определить шаблон, для которого функция iglob() будет собирать имена файлов и перечислять их в выводе. Шаблон, который мы определяем внутри функции iglob()(например, расширение файла) для сопоставления с образцом, должен начинаться с символа ‘*’.

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

Взгляните на следующую программу Python с реализацией функции iglob():

Сначала мы импортировали модуль glob, чтобы использовать его функцию iglob() в программе. После этого мы инициализировали переменную, в которой мы использовали функцию iglob(), и внутри функции iglob() мы определили шаблон, для которого функция будет выполнять сопоставление с шаблоном имени файла. Шаблон, который мы определили в функции iglob(), – это все файлы с расширением .py, то есть «* .py».

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

Как видно из вывода, первая программа распечатала тип класса инициализированной переменной, а затем распечатала список файлов с расширением «.py».

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

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

Ниже приведен синтаксис использования функции glob() модуля glob внутри программы Python:

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

Пример 2: Посмотрите на следующую программу Python с реализацией функции glob():

Как видно из приведенного выше примера программы, мы следовали той же логике, что и в примере 1 с функцией iglob(). Программа вернула список всех имен файлов, соответствующих шаблону, который мы установили внутри функции glob().

3. Функция escape(): escape() становится очень действенным, поскольку позволяет нам избежать заданной последовательности символов, которую мы определили в функции. Функция escape() очень удобна для поиска файлов, в именах которых есть определенные символы (как мы определим в функции). Она будет соответствовать последовательности, сопоставляя произвольную буквальную строку в именах файлов с этим специальным символом в них.

Ниже приведен синтаксис использования функции escape() модуля glob внутри программы Python:

Escape() следует использовать с функцией glob() или iglob(), чтобы в результате мы могли распечатать список имен файлов в выходных данных. Теперь давайте воспользуемся этой функцией escape() в примере программы, чтобы лучше понять ее реализацию и функции.

Пример 3: Посмотрите на следующую программу Python с реализацией функции escape():

Сначала мы определили последовательность символов для последовательности escape(), чтобы функция escape() собирала все имена файлов, содержащие эту специальную последовательность символов. Мы использовали вложенный цикл for, так что сначала мы создали путь для функции glob() из функции escape().

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

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

Вывод

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

Источник статьи: http://pythonpip.ru/osnovy/modul-glob-v-python-i-ego-funktsii

8 команд для Python по работе с файлами и файловой системой, которые обязательно нужно знать

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

Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).

Показать текущий каталог

Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.

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

Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:

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

Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.

Проверяем, существует файл или каталог

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

Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.

В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:

Эта же команда подходит и для работы с файлами:

Если папки или файла нет, команда возвращает false.

Объединение компонентов пути

В предыдущем примере я намеренно использовал слеш «/» для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш «\» в качестве разделителя.

Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:

Создание директории

Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():

Давайте посмотрим, как это работает на практике.

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

Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:

Еще один совет по созданию каталогов. Иногда нам нужно создать подкаталоги с уровнем вложенности 2 или более. Если мы все еще используем os.mkdir (), нам нужно будет сделать это несколько раз. В этом случае мы можем использовать os.makedirs (). Эта функция создаст все промежуточные каталоги так же, как флаг mkdir -p в системе Linux:

Вот что получается в результате.

Показываем содержимое директории

Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.

Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:

В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:

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

Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:

Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.

Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.

Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:

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

Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.

Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.

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

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

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

Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():

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

Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.

Когда нужно удалить файл, нужно воспользоваться командой os.remove():

Если требуется удалить каталог, на помощь приходит os.rmdir():

Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.

Функция shutil.rmtree() сделает все, что нужно:

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

Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.

Источник статьи: http://habr.com/ru/company/selectel/blog/547290/

Работа с модулем pathlib в Python 3

Порой разработчику приходится отойти от мира программной абстракции и обратиться к практическим вещам. Например, к файловой системе. Манипуляции путями файловых систем в Python 3 реализуется несколькими библиотеками. Одна из них — pathlib. И в этой статье мы хотели бы вам рассказать о том, как использовать модуль pathlib и решать практические задачи с помощью него.

Файловая система

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

Итак, у нас есть файл example.exe расположенный в C:\Program Files (файловая система Windows). У этого файла есть 4 основные характеристики с точки зрения файловой системы:

  • Путь — это идентификатор файла, определяющий его местонахождение в файловой системе, исходя из последовательности названий каталогов. Их разделяют на два типа:
    • Абсолютный путь — полный путь файла, начинающийся с корневого каталога. Например, C:\Program Files\example.exe
    • Относительный путь — путь к файлу относительно другого каталога. Например, Program Files\example.exe
  • Каталог (C:\Program Files) — это объект в файловой системе, необходимой для иерархической организации файловой системы. Иногда его называют директория или папка. Название «папка» отлично описывает практическое название этого объекта — удобное хранение и быстрое нахождение при необходимости.
  • Расширение (.exe) — это формат файла. С помощью расширения пользователь или программы определяют тип данных, хранящихся в файле (видео, текст, музыка и т.д.).

Экземпляры Path

Импортируем модуль pathlib для манипуляции путями файловых систем :

Классы этого модуля можно разбить на два типа: Pure (или «чистые») и Concrete (или «конкретные»). Первые нужны для абстрактной вычислительной работы с путями, при которой не осуществляется непосредственное взаимодействие с файловой системой ОС. Вторые же необходимы для взаимодействия с ней (создания и удаление директорий, чтения файлов и т.д.).

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

Итак, начнем с малого. Создадим переменную с типом данных Path:

Как видим, модуль сам подстроился под операционную систему — в нашем случае Windows 10. Конструктор Path(args) создает новый экземпляр класса Path и на вход принимает его компоненты (директории, файлы, другие пути).

Путь PathExample — относительный. Чтобы он стал абсолютным необходимо добавить корневой каталог.

С помощью методов Path.home() и Path.cwd() мы можем получить каталог текущего пользователя и текущую рабочую папку:

Сделаем PathExample абсолютным и рассмотрим другие аспекты работы с pathlib:

С помощью оператора «/» мы можем создавать новые пути.

Атрибуты Path

Pathlib предоставляет различные методы и свойства для получения разнообразной информации о путях. Для наглядности добавим введем новую переменную AttributeExample и добавим в неё файл:

Чтобы узнать букву или имя диска, необходимо использовать свойство.drive:

Родительские каталоги

Мы можем получить родительские каталоги с помощью двух свойств: parent и parents[n].

Parent возвращает родительский каталог:

Чтобы получить более «высокие» родительские каталоги, можно использовать parent несколько раз:

Или воспользоваться свойством parents[n], который возвращает n-го предка:

Для получения имени файла нужно использовать свойство .name:

Для того, чтобы получить расширение файла, необходимо использовать свойство .suffix или .suffixes (при наличии двойного расширения, например .tar.gz):

Абсолютный или относительный путь

Мы можем определить, является ли путь абсолютным, с помощью метода .is_absolute():

Составные части

Мы можем разложить путь на компоненты с помощью свойства .parts:

Сравнение путей

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

Операторы сравнения

Мы можем узнать, являются ли пути одинаковыми:

Стоит упомянуть, что такое же сравнение для UNIX-систем будет давать результат False:

Это связано с тем, что в Windows регистр не имеет значения в имени директории, в отличие от файловой системы UNIX-систем.

Методы сравнения

Мы можем узнать, является ли один путь частью другого, с помощью метода .is_relative_to():

Также можно использовать шаблоны для проверки с помощью метода .match():

Создание и удаление папок и файлов

Для создания папок с помощью модуля pathlib необходимо использовать метод .mkdir(parents = True/False, exist_ok =True/False). Метод получает на вход (помимо пути, по которому нужно создать папку) 2 логические переменные: parents и exist_ok.

Если значение parents = True, то метод создаст родительские каталоги (при их отсутствии). Если False, то вернет ошибку при их отсутствии.

Exist_ok отвечает за обработку ошибок, возникающих при существовании целевой папки.

Создадим папку CreateExample, но сначала проверим, есть ли уже такая директория с помощью метода .is_dir():

Теперь попробуем его создать:

Проверим папку в проводнике:

Как видим, появилась именно папка, а не файл. Чтобы создать пустой файл, необходимо использовать метод .touch(). Но сначала удалим папку file.txt с помощью метода .rmdir():

Для удаления файлов существует метод .unlink().

Поиск файлов

На основе имеющегося каталога создадим более сложную структуру:

Мы создали и получили такую структуру (начиная с C:\Users\Blog\Timeweb):

Использование модуля pathlib для поиска файлов подразумевает применение цикла for и метода .glob():

Этот код не смог ничего найти, так как он не рассматривал вложенные папки. Чтобы он корректно работал, необходимо его немного изменить:

Чтение и запись в файл

Обе операции можно выполнять как в текстовом, так и в бинарном режиме. Мы сосредоточимся на первом варианте. Для работы с содержимым файла pathlib предоставляет 4 метода:

  • Чтение: .read_text() и .read_bytes();
  • Запись: .write_text() и .write_bytes();

Запишем какую-нибудь важную информацию в файл, которую просто необходимо запомнить. Например, « Timeweb Cloud предлагает очень крутые облачные серверы !». Действительно, такое лучше где-нибудь записать:

Источник статьи: http://timeweb.cloud/blog/rabota-s-modulem-pathlib-v-python-3

Работа с файлами в Python

Многим из нас знакома ситуация, когда компьютер оказывался завален тоннами беспорядочных файлов. Только что вы открывали большой zip-архив, спустя мгновение – файлы повсюду в этой директории, вперемешку с важными документами. Наверняка приходилось мучительно скучно сортировать эту свалку вручную? Чтобы облегчить подобные задачи, мы сейчас погрузимся в «умную» работу с файлами при помощи Python.

Итак, приступим, вооружившись Python версии 3.4 или выше. Сначала пройдемся по модулю OS, а по ходу дела познакомимся еще с несколькими. Всё, что мы будем использовать, доступно в Python «с коробки», так что ничего дополнительно устанавливать не потребуется.

Генератор случайных файлов

Создадим папку ManageFiles , а внутри нее еще одну — RandomFiles . Дерево каталогов теперь должно выглядеть вот так:

Чтобы поиграться с файлами, мы сгенерируем их случайным образом в директории RandomFiles . Создайте файл create_random_files.py в папке ManageFiles . Вот что должно получиться:

Готово? Теперь поместите в файл следующий код, и перейдем к его рассмотрению:

Начиная с Python 3.4 мы получили pathlib, нашу маленькую волшебную палочку. Также мы импортируем функцию random для генерации случайных чисел, но ее мы посмотрим в действии чуть ниже.

Сперва создадим список файловых расширений для формирования названий файлов. Не стесняйтесь добавить туда свои варианты.

Далее мы переходим в папку RandomFiles и запускаем цикл. В нем мы просто говорим: возьми каждый элемент list_of_extensions и сделай с ним кое-что во внутреннем цикле 20 раз.

Теперь пришло время для импортированной функции random . Используем ее для производства случайных чисел от 1 до 50. Это просто не очень творческий способ побыстрее дать названия нашим тестовым файлам: к сгенерированному числу добавим расширение файла и получим что-то вроде 23.txt или 14.txt . И так 20 раз для каждого расширения. В итоге образуется беспорядок, достаточный для того, чтобы его было лень сортировать вручную.

Итак, запустим наш генератор хаоса через терминал.

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

В той же директории, где create_random_files.py , создадим файл clean_up.py и поместим туда следующий код.

Способ 1

Для этого импортируем еще две библиотеки: shutil и glob. Первая поможет перемещать файлы, а вторая – находить и систематизировать. Но обо всем по порядку.

Для начала получим список всех файлов в директории.

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

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

Сейчас наша переменная our_file выглядит как-нибудь так: 5.docx . Когда разделим ее, получим следующее:

Мы возьмем отсюда второй элемент по индексу [1], то есть .docx . Ведь по индексу [0] у нас располагается 5 .

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

Заметим, что в списке типов файлов каждое расширение содержит . в начале. Если мы назовем так папки на UNIX-системе, то они будут скрытыми, что не входит в наши намерения.

Поэтому, итерируя по нашему множеству, мы заменяем точку на пустую строку. И создаем папку с полученным названием.

Но чтобы переместить файлы, нам все еще нужно расширение .docx .

Этим попросту отбираем все файлы, оканчивающиеся расширением .docx . Заметьте, что в f’*.‘) нет пробелов.

Символ подстановки * обозначает, что подходит любое имя, если оно заканчивается на .docx . Поскольку мы уже включили точку в поиск, мы используем [1:], что значит «все после первого символа». В нашем примере это docx .

Что дальше? Перемещаем любые файлы с данным расширением в директорию с тем же названием.

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

Способ 2

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

Оба варианта сработают, и все ваши файлы будут отсортированы по расширению.

Вот и все. Если вам когда-либо понадобится отсортировать файлы таким образом, вы сэкономите немало времени ?. Код упражнения доступен здесь.

Источник статьи: http://pythonist.ru/rabota-s-fajlami-v-python/

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *