Как найти файлы с определенным расширением python

  1. Метод поиска файлов с определённым расширением glob.glob
  2. Метод os.listdir() для поиска файлов с определённым расширением
  3. Метод pathlib.glob для поиска файлов с определённым расширением
  4. Поиск файлов с определенным расширением в каталоге и его подкаталогах на Python
  5. Модуль pathlib ищет файлы рекурсивно

Как найти файлы с определенным расширением только на Python

В статье представлены различные методы поиска файлов с определённым расширением только на Python.

Метод поиска файлов с определённым расширением glob.glob

Мы могли бы использовать модуль glob.glob для поиска файлов с определённым расширением только на Python.

import glob

targetPattern = r"C:Test*.txt"
glob.glob(targetPattern)

Приведенные выше коды демонстрируют, как найти файлы с расширением txt в директории C:Test.

Метод os.listdir() для поиска файлов с определённым расширением

Функция os.listdir() перечисляет все файлы в данной директории, без информации о пути к файлу. Вы можете извлечь файлы с определенным расширением, используя функцию str.endswith().

>>> import os
>>> fileDir = r"C:Test"
>>> fileExt = r".txt"
>>> [_ for _ in os.listdir(fileDir) if _.endswith(fileExt)]
['test.txt', 'test1.txt']

Вам необходимо построить полный путь с помощью функции os.path.join().

>>> import os
>>> fileDir = r"C:Test"
>>> fileExt = r".txt"
>>> [os.path.join(fileDir, _) for _ in os.listdir(fileDir) if _.endswith(fileExt)]
['C:\Test\test.txt', 'C:\Test\test1.txt']

Метод pathlib.glob для поиска файлов с определённым расширением

pathlib модуль представлен на Python 3.4, который предлагает объектно-ориентированные пути к файловой системе. Он предоставляет два стиля: Пути Windows в ОС Windows и пути POSIX в Unix-alike системах.

>>> import pathlib
>>> fileDir = r"C:Test"
>>> fileExt = r"*.txt"
>>> list(pathlib.Path(fileDir).glob(fileExt))
[WindowsPath('C:/Test/test.txt'), WindowsPath('C:/Test/test1.txt')]

Результат представлен с помощью WindowsPath, и вы можете преобразовать результат в строковое представление, добавив str(), типа

>>> [str(_) for _ in pathlib.Path(fileDir).glob(fileExt)]
['C:\Test\test.txt', 'C:\Test\test.txt']

Поиск файлов с определенным расширением в каталоге и его подкаталогах на Python

Шаблон C:Test*.txt ищет только txt файлы в каталоге C:Test, но не в его подкаталогах. Если вы также хотите получить txt файлы в подкаталогах, вы можете немного изменить шаблон.

import glob

targetPattern = r"C:Test***.txt"
glob.glob(targetPattern)

Подстановка ** между Test и *.txt означает, что он должен найти txt файлы как в каталоге, так и в его подкаталогах.

Модуль pathlib ищет файлы рекурсивно

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

>>> import pathlib
>>> fileDir = r"C:Test"
>>> fileExt = r"***.txt"
>>> list(pathlib.Path(fileDir).glob(fileExt))
[WindowsPath('C:/Test/test.txt'), WindowsPath('C:/Test/test1.txt'), WindowsPath('C:/Test/sub/test1.txt')]

The implementation of shutil.copytree is in the docs. I mofdified it to take a list of extentions to INCLUDE.

def my_copytree(src, dst, symlinks=False, *extentions):
    """ I modified the 2.7 implementation of shutils.copytree
    to take a list of extentions to INCLUDE, instead of an ignore list.
    """
    names = os.listdir(src)
    os.makedirs(dst)
    errors = []
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                my_copytree(srcname, dstname, symlinks, *extentions)
            else:
                ext = os.path.splitext(srcname)[1]
                if not ext in extentions:
                    # skip the file
                    continue
                copy2(srcname, dstname)
            # XXX What about devices, sockets etc.?
        except (IOError, os.error), why:
            errors.append((srcname, dstname, str(why)))
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error, err:
            errors.extend(err.args[0])
    try:
        copystat(src, dst)
    # except WindowsError: # cant copy file access times on Windows
    #     pass
    except OSError, why:
        errors.extend((src, dst, str(why)))
    if errors:
        raise Error(errors)

Usage: For example, to copy only .config and .bat files….

my_copytree(source, targ, ‘.config’, ‘.bat’)

Python v3.5+

Fast method using os.scandir in a recursive function. Searches for all files with a specified extension in folder and sub-folders. It is fast, even for finding 10,000s of files.

I have also included a function to convert the output to a Pandas Dataframe.

import os
import re
import pandas as pd
import numpy as np


def findFilesInFolderYield(path,  extension, containsTxt='', subFolders = True, excludeText = ''):
    """  Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)

    path:               Base directory to find files
    extension:          File extension to find.  e.g. 'txt'.  Regular expression. Or  'lsd' to match ls1, ls2, ls3 etc
    containsTxt:        List of Strings, only finds file if it contains this text.  Ignore if '' (or blank)
    subFolders:         Bool.  If True, find files in all subfolders under path. If False, only searches files in the specified folder
    excludeText:        Text string.  Ignore if ''. Will exclude if text string is in path.
    """
    if type(containsTxt) == str: # if a string and not in a list
        containsTxt = [containsTxt]
    
    myregexobj = re.compile('.' + extension + '$')    # Makes sure the file extension is at the end and is preceded by a .
    
    try:   # Trapping a OSError or FileNotFoundError:  File permissions problem I believe
        for entry in os.scandir(path):
            if entry.is_file() and myregexobj.search(entry.path): # 
    
                bools = [True for txt in containsTxt if txt in entry.path and (excludeText == '' or excludeText not in entry.path)]
    
                if len(bools)== len(containsTxt):
                    yield entry.stat().st_size, entry.stat().st_atime_ns, entry.stat().st_mtime_ns, entry.stat().st_ctime_ns, entry.path
    
            elif entry.is_dir() and subFolders:   # if its a directory, then repeat process as a nested function
                yield from findFilesInFolderYield(entry.path,  extension, containsTxt, subFolders)
    except OSError as ose:
        print('Cannot access ' + path +'. Probably a permissions error ', ose)
    except FileNotFoundError as fnf:
        print(path +' not found ', fnf)

def findFilesInFolderYieldandGetDf(path,  extension, containsTxt, subFolders = True, excludeText = ''):
    """  Converts returned data from findFilesInFolderYield and creates and Pandas Dataframe.
    Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)

    path:               Base directory to find files
    extension:          File extension to find.  e.g. 'txt'.  Regular expression. Or  'lsd' to match ls1, ls2, ls3 etc
    containsTxt:        List of Strings, only finds file if it contains this text.  Ignore if '' (or blank)
    subFolders:         Bool.  If True, find files in all subfolders under path. If False, only searches files in the specified folder
    excludeText:        Text string.  Ignore if ''. Will exclude if text string is in path.
    """
    
    fileSizes, accessTimes, modificationTimes, creationTimes , paths  = zip(*findFilesInFolderYield(path,  extension, containsTxt, subFolders))
    df = pd.DataFrame({
            'FLS_File_Size':fileSizes,
            'FLS_File_Access_Date':accessTimes,
            'FLS_File_Modification_Date':np.array(modificationTimes).astype('timedelta64[ns]'),
            'FLS_File_Creation_Date':creationTimes,
            'FLS_File_PathName':paths,
                  })
    
    df['FLS_File_Modification_Date'] = pd.to_datetime(df['FLS_File_Modification_Date'],infer_datetime_format=True)
    df['FLS_File_Creation_Date'] = pd.to_datetime(df['FLS_File_Creation_Date'],infer_datetime_format=True)
    df['FLS_File_Access_Date'] = pd.to_datetime(df['FLS_File_Access_Date'],infer_datetime_format=True)

    return df

ext =   'txt'  # regular expression 
containsTxt=[]
path = 'C:myFolder'
df = findFilesInFolderYieldandGetDf(path,  ext, containsTxt, subFolders = True)

Типовая задача – найти все файлы в каталоге с определенным расширением. Вторая разновидность задачи – найти все файлы с определенным расширением, включая подкаталоги

Решение:

  1. Используя glob:

    import glob, os
    os.chdir(“/mydir”)
    for file in glob.glob(“*.txt”):
    print(file)

  2. Используя os.listdir:

    import os
    for file in os.listdir(“/mydir”):
    if file.endswith(“.txt”):
    print(os.path.join(“/mydir”, file))

  3. Рекурсивный обход всех папок, с помощью os.walk:

    import os
    for root, dirs, files in os.walk(“/mydir”):
    for file in files:
    if file.endswith(“.txt”):
    print(os.path.join(root, file))

Использованы примеры с http://stackoverflow.com/questions/3964681/find-all-files-in-a-directory-with-extension-txt-in-python

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

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

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

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

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

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

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

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

  1. fnmatch()
  2. scandir()
  3. path.expandvars()
  4. path.expanduser()

Первые две функции, представленные в приведенном выше списке, то есть функция 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, и с помощью этих функций мы можем очень плавно выполнить задачу сопоставления с образцом имени файла:

  1. iglob()
  2. glob()
  3. escape()

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

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

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

 
iglob(pathname, *, recursive=False) 

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

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

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

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

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

Пример 1:

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

 
# Import glob module in the program 
import glob as gb 
# Initialize a variable 
inVar = gb.iglob("*.py") # Set Pattern in iglob() function 
# Returning class type of variable 
print(type(inVar)) 
# Printing list of names of all files that matched the pattern 
print("List of the all the files in the directory having extension .py: ") 
for py in inVar:  
    print(py) 

Вывод:

<class 'generator'> 
List of the all the files in the directory having extension .py:  
adding.py 
changing.py 
code#1.py 
code#2.py 
code-3.py 
code-4.py 
code.py 
code37.py 
code_5.py 
code_6.py 
configuring.py 

Объяснение:

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

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

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

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

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

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

 
glob(pathname, *, recursive = True) 

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

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

 
# Import glob module in the program 
import glob as gb 
# Initialize a variable 
genVar = gb.glob("*.py") # Set Pattern in glob() function 
# Printing list of names of all files that matched the pattern 
print("List of the all the files in the directory having extension .py: ") 
for py in genVar:  
    print(py)    

Вывод:

List of the all the files in the directory having extension .py:  
adding.py 
changing.py 
code#1.py 
code#2.py 
code-3.py 
code-4.py 
code.py 
code37.py 
code_5.py 
code_6.py 
configuring.py 

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

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

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

 
>> escape(pathname) 

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

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

 
# Import glob module in the program 
import glob as gb 
# Initialize a variable 
charSeq = "-_#" 
print("Following is the list of filenames that match the special character sequence of escape function: ") 
# Using nested for loop to get the filenames 
for splChar in charSeq: 
    # Pathname for the glob() function 
    escSet = "*" + gb.escape(splChar) + "*" + ".py" 
    # Printing list of filenames with glob() function 
    for py in(gb.glob(escSet)):  
        print(py)  

Вывод:

Following is the list of filenames that match the special character sequence of escape function:  
code-3.py 
code-4.py 
code_5.py 
code_6.py 
code#1.py 
code#2.py 

Объяснение:

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

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

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

Вывод

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

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.

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