Как я могу перечислить все файлы каталога в Python и добавить их в список?

3466
duhhunjonn 8 Июл 2010 в 23:31
27
 – 
rds
5 Янв 2012 в 13:32

20 ответов

os.listdir() предоставит вам все, что находится в каталоге - файлы и каталоги .

Если вам нужны только файлы, вы можете либо отфильтровать их, используя os.path :

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

Или вы можете использовать os.walk() , что даст два списка для каждого каталога, который он посещает, с разделением на файлы и каталоги . Если вам нужен только верхний каталог, вы можете просто сломать его в первый раз, когда он даст

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break
4068
Vaibhav 11 Мар 2020 в 22:56
85
Немного проще: (_, _, filenames) = walk(mypath).next() (если вы уверены, что прогулка вернет хотя бы одно значение, которое должно).
 – 
misterbee
15 Июл 2013 в 00:56
9
Небольшая модификация для хранения полных путей: for (dirpath, dirnames, filenames) в os.walk (mypath): checkum_files.extend (os.path.join (dirpath, filename) для имени файла в именах файлов) break
 – 
okigan
24 Сен 2013 в 01:31
148
f.extend(filenames) на самом деле не эквивалентно f = f + filenames. extend изменит f на месте, тогда как добавление создает новый список в новом месте памяти. Это означает, что extend обычно более эффективен, чем +, но иногда это может привести к путанице, если несколько объектов содержат ссылки на список. Наконец, стоит отметить, что f += filenames эквивалентно f.extend(filenames), не f = f + filenames.
 – 
Benjamin Hodgson♦
22 Окт 2013 в 12:55
30
@misterbee, ваше решение - лучшее, только одно небольшое улучшение: _, _, filenames = next(walk(mypath), (None, None, []))
 – 
bgusach
5 Мар 2015 в 10:36
33
В python 3.x используйте (_, _, filenames) = next(os.walk(mypath))
 – 
ET-CS
16 Июн 2017 в 05:08

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

import glob
print(glob.glob("/home/adam/*.txt"))

Он вернет список с запрошенными файлами:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]
1631
Peter Mortensen 23 Май 2018 в 21:36
15
Это ярлык для listdir + fnmatch docs.python.org/library/fnmatch.html # fnmatch.fnmatch
 – 
Stefano
1 Июл 2011 в 17:03
29
Чтобы уточнить, это не возвращает "полный путь"; он просто возвращает расширение глобуса, каким бы оно ни было. Например, если задано /home/user/foo/bar/hello.txt, то при запуске в каталоге foo glob("bar/*.txt") вернет bar/hello.txt. Бывают случаи, когда вам действительно нужен полный (т. Е. Абсолютный) путь; в этих случаях см. stackoverflow.com/questions/51520/…
 – 
michael
16 Авг 2016 в 15:07
1
Связано: рекурсивный поиск файлов с помощью glob: stackoverflow.com/a/2186565/4561887
 – 
Gabriel Staples
3 Сен 2018 в 06:25
6
Не отвечает на этот вопрос. glob.glob("*") будет.
 – 
Jean-François Fabre♦
17 Май 2019 в 21:36
Красивая!!!! так что .... x=glob.glob("../train/*.png") даст мне массив моих путей, если я знаю имя папки. Так круто!
 – 
Jennifer Crosby
14 Мар 2020 в 07:06

Получите список файлов с Python 2 и 3


os.listdir()

Как получить все файлы (и каталоги) в текущем каталоге (Python 3)

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

 import os
 arr = os.listdir()
 print(arr)

 >>> ['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

glob

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

import glob

txtfiles = []
for file in glob.glob("*.txt"):
    txtfiles.append(file)

glob с пониманием списка

import glob

mylist = [f for f in glob.glob("*.txt")]

glob с функцией

Функция возвращает список заданного расширения (.txt, .docx и т. д.) в аргументе

import glob

def filebrowser(ext=""):
    "Returns files with an extension"
    return [f for f in glob.glob(f"*{ext}")]

x = filebrowser(".txt")
print(x)

>>> ['example.txt', 'fb.txt', 'intro.txt', 'help.txt']

glob расширение предыдущего кода

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

import glob

def filesearch(word=""):
    """Returns a list with all files with the word/extension in it"""
    file = []
    for f in glob.glob("*"):
        if word[0] == ".":
            if f.endswith(word):
                file.append(f)
                return file
        elif word in f:
            file.append(f)
            return file
    return file

lookfor = "example", ".py"
for w in lookfor:
    print(f"{w:10} found => {filesearch(w)}")

Выход

example    found => []
.py        found => ['search.py']

Получение полного имени пути с помощью os.path.abspath

Как вы заметили, в приведенном выше коде отсутствует полный путь к файлу. Если вам нужен абсолютный путь, вы можете использовать другую функцию модуля os.path, называемую _getfullpathname, указав в качестве аргумента файл, полученный от os.listdir(). Есть и другие способы получить полный путь, как мы проверим позже (я заменил, как предложил mexmex, _getfullpathname на abspath).

 import os
 files_path = [os.path.abspath(x) for x in os.listdir()]
 print(files_path)

 >>> ['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

Получить полный путь к типу файла во всех подкаталогах с помощью walk

Я считаю, что это очень полезно для поиска материалов во многих каталогах, и это помогло мне найти файл, название которого я не помню:

import os

# Getting the current work directory (cwd)
thisdir = os.getcwd()

# r=root, d=directories, f = files
for r, d, f in os.walk(thisdir):
    for file in f:
        if file.endswith(".docx"):
            print(os.path.join(r, file))

os.listdir(): получить файлы в текущем каталоге (Python 2)

В Python 2, если вам нужен список файлов в текущем каталоге, вы должны указать аргумент как '.' или os.getcwd () в методе os.listdir.

 import os
 arr = os.listdir('.')
 print(arr)

 >>> ['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Чтобы подняться в дереве каталогов

# Method 1
x = os.listdir('..')

# Method 2
x= os.listdir('/')

Получить файлы: os.listdir() в определенном каталоге (Python 2 и 3)

 import os
 arr = os.listdir('F:\\python')
 print(arr)

 >>> ['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Получить файлы из определенного подкаталога с помощью os.listdir()

import os

x = os.listdir("./content")

os.walk('.') - текущий каталог

 import os
 arr = next(os.walk('.'))[2]
 print(arr)

 >>> ['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

next(os.walk('.')) и os.path.join('dir', 'file')

 import os
 arr = []
 for d,r,f in next(os.walk("F:\\_python")):
     for file in f:
         arr.append(os.path.join(r,file))

 for f in arr:
     print(files)

>>> F:\\_python\\dict_class.py
>>> F:\\_python\\programmi.txt

next(os.walk('F:\\') - получить полный путь - понимание списка

 [os.path.join(r,file) for r,d,f in next(os.walk("F:\\_python")) for file in f]

 >>> ['F:\\_python\\dict_class.py', 'F:\\_python\\programmi.txt']

os.walk - получить полный путь - все файлы в подкаталогах **

x = [os.path.join(r,file) for r,d,f in os.walk("F:\\_python") for file in f]
print(x)

>>> ['F:\\_python\\dict.py', 'F:\\_python\\progr.txt', 'F:\\_python\\readl.py']

os.listdir() - получить только текстовые файлы

 arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
 print(arr_txt)

 >>> ['work.txt', '3ebooks.txt']

Использование glob для получения полного пути к файлам

Если мне понадобится абсолютный путь к файлам:

from path import path
from glob import glob
x = [path(f).abspath() for f in glob("F:\\*.txt")]
for f in x:
    print(f)

>>> F:\acquistionline.txt
>>> F:\acquisti_2018.txt
>>> F:\bootstrap_jquery_ecc.txt

Использование os.path.isfile для исключения каталогов в списке

import os.path
listOfFiles = [f for f in os.listdir() if os.path.isfile(f)]
print(listOfFiles)

>>> ['a simple game.py', 'data.txt', 'decorator.py']

Использование pathlib из Python 3.4

import pathlib

flist = []
for p in pathlib.Path('.').iterdir():
    if p.is_file():
        print(p)
        flist.append(p)

 >>> error.PNG
 >>> exemaker.bat
 >>> guiprova.mp3
 >>> setup.py
 >>> speak_gui2.py
 >>> thumb.PNG

С list comprehension:

flist = [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Или используйте pathlib.Path() вместо pathlib.Path(".")

Используйте метод glob в pathlib.Path ()

import pathlib

py = pathlib.Path().glob("*.py")
for file in py:
    print(file)

>>> stack_overflow_list.py
>>> stack_overflow_list_tkinter.py

Получите все и только файлы с os.walk

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)
print(y)

>>> ['append_to_list.py', 'data.txt', 'data1.txt', 'data2.txt', 'data_180617', 'os_walk.py', 'READ2.py', 'read_data.py', 'somma_defaltdic.py', 'substitute_words.py', 'sum_data.py', 'data.txt', 'data1.txt', 'data_180617']

Получить только файлы со следующим и перейти в каталог

 import os
 x = next(os.walk('F://python'))[2]
 print(x)

 >>> ['calculator.bat','calculator.py']

Получить только каталоги с помощью next и пройти по каталогу

 import os
 next(os.walk('F://python'))[1] # for the current dir use ('.')

 >>> ['python3','others']

Получить все имена подкаталогов с помощью walk

for r,d,f in os.walk("F:\\_python"):
    for dirs in d:
        print(dirs)

>>> .vscode
>>> pyexcel
>>> pyschool.py
>>> subtitles
>>> _metaprogramming
>>> .ipynb_checkpoints

os.scandir() из Python 3.5 и выше

import os
x = [f.name for f in os.scandir() if f.is_file()]
print(x)

>>> ['calculator.bat','calculator.py']

# Another example with scandir (a little variation from docs.python.org)
# This one is more efficient than os.listdir.
# In this case, it shows the files only in the current directory
# where the script is executed.

import os
with os.scandir() as i:
    for entry in i:
        if entry.is_file():
            print(entry.name)

>>> ebookmaker.py
>>> error.PNG
>>> exemaker.bat
>>> guiprova.mp3
>>> setup.py
>>> speakgui4.py
>>> speak_gui2.py
>>> speak_gui3.py
>>> thumb.PNG

Примеры:

Бывший. 1: Сколько файлов в подкаталогах?

В этом примере мы ищем количество файлов, которые включены во весь каталог и его подкаталоги.

import os

def count(dir, counter=0):
    "returns number of files in dir and subdirs"
    for pack in os.walk(dir):
        for f in pack[2]:
            counter += 1
    return dir + " : " + str(counter) + "files"

print(count("F:\\python"))

>>> 'F:\\\python' : 12057 files'

Пример 2: Как скопировать все файлы из одного каталога в другой?

Скрипт для упорядочивания вашего компьютера, находит все файлы определенного типа (по умолчанию: pptx) и копирует их в новую папку.

import os
import shutil
from path import path

destination = "F:\\file_copied"
# os.makedirs(destination)

def copyfile(dir, filetype='pptx', counter=0):
    "Searches for pptx (or other - pptx is the default) files and copies them"
    for pack in os.walk(dir):
        for f in pack[2]:
            if f.endswith(filetype):
                fullpath = pack[0] + "\\" + f
                print(fullpath)
                shutil.copy(fullpath, destination)
                counter += 1
    if counter > 0:
        print('-' * 30)
        print("\t==> Found in: `" + dir + "` : " + str(counter) + " files\n")

for dir in os.listdir():
    "searches for folders that starts with `_`"
    if dir[0] == '_':
        # copyfile(dir, filetype='pdf')
        copyfile(dir, filetype='txt')


>>> _compiti18\Compito Contabilità 1\conti.txt
>>> _compiti18\Compito Contabilità 1\modula4.txt
>>> _compiti18\Compito Contabilità 1\moduloa4.txt
>>> ------------------------
>>> ==> Found in: `_compiti18` : 3 files

Бывший. 3: Как получить все файлы в текстовом файле

Если вы хотите создать текстовый файл со всеми именами файлов:

import os
mylist = ""
with open("filelist.txt", "w", encoding="utf-8") as file:
    for eachfile in os.listdir():
        mylist += eachfile + "\n"
    file.write(mylist)

Пример: txt со всеми файлами жесткого диска

"""
We are going to save a txt file with all the files in your directory.
We will use the function walk()
"""

import os

# see all the methods of os
# print(*dir(os), sep=", ")
listafile = []
percorso = []
with open("lista_file.txt", "w", encoding='utf-8') as testo:
    for root, dirs, files in os.walk("D:\\"):
        for file in files:
            listafile.append(file)
            percorso.append(root + "\\" + file)
            testo.write(file + "\n")
listafile.sort()
print("N. of files", len(listafile))
with open("lista_file_ordinata.txt", "w", encoding="utf-8") as testo_ordinato:
    for file in listafile:
        testo_ordinato.write(file + "\n")

with open("percorso.txt", "w", encoding="utf-8") as file_percorso:
    for file in percorso:
        file_percorso.write(file + "\n")

os.system("lista_file.txt")
os.system("lista_file_ordinata.txt")
os.system("percorso.txt")

Весь файл C: \ в одном текстовом файле

Это более короткая версия предыдущего кода. Измените папку, в которой нужно начать поиск файлов, если вам нужно начать с другой позиции. Этот код генерирует 50 МБ текстового файла на моем компьютере с менее чем 500 000 строками с файлами с полным путем.

import os

with open("file.txt", "w", encoding="utf-8") as filewrite:
    for r, d, f in os.walk("C:\\"):
        for file in f:
            filewrite.write(f"{r + file}\n")

Как записать файл со всеми путями в папке типа

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

import os

def searchfiles(extension='.ttf', folder='H:\\'):
    "Create a txt file with all the file of a type"
    with open(extension[1:] + "file.txt", "w", encoding="utf-8") as filewrite:
        for r, d, f in os.walk(folder):
            for file in f:
                if file.endswith(extension):
                    filewrite.write(f"{r + file}\n")

# looking for png file (fonts) in the hard disk H:\
searchfiles('.png', 'H:\\')

>>> H:\4bs_18\Dolphins5.png
>>> H:\4bs_18\Dolphins6.png
>>> H:\4bs_18\Dolphins7.png
>>> H:\5_18\marketing html\assets\imageslogo2.png
>>> H:\7z001.png
>>> H:\7z002.png

(Новое) Найдите все файлы и откройте их с помощью графического интерфейса tkinter.

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

import tkinter as tk
import os

def searchfiles(extension='.txt', folder='H:\\'):
    "insert all files in the listbox"
    for r, d, f in os.walk(folder):
        for file in f:
            if file.endswith(extension):
                lb.insert(0, r + "\\" + file)

def open_file():
    os.startfile(lb.get(lb.curselection()[0]))

root = tk.Tk()
root.geometry("400x400")
bt = tk.Button(root, text="Search", command=lambda:searchfiles('.png', 'H:\\'))
bt.pack()
lb = tk.Listbox(root)
lb.pack(fill="both", expand=1)
lb.bind("<Double-Button>", lambda x: open_file())
root.mainloop()
815
Giovanni G. PY 2 Мар 2020 в 18:44
9
Это мешанина из слишком большого количества ответов на вопросы, которые здесь не задаются. Также, возможно, стоит объяснить, в чем заключаются предостережения или рекомендуемые подходы. Мне не лучше знать один способ, чем 20 способов сделать то же самое, если я не знаю, какой из них более уместен и когда.
 – 
cs95
27 Янв 2020 в 12:27
Хорошо, как можно скорее я посмотрю на свой ответ и постараюсь сделать его более чистым и с более полезной информацией о различиях между методами и т. Д.
 – 
Giovanni G. PY
29 Янв 2020 в 22:56
Вы не должны определять расширение файла, проверяя, содержит ли имя файла подстроку. Это могло вызвать много неприятностей. Я рекомендую всегда проверять, заканчивается ли имя файла конкретной подстрокой.
 – 
ni1ight
2 Мар 2020 в 17:38
Хорошо, @ n1light я поменял код ...
 – 
Giovanni G. PY
2 Мар 2020 в 18:44
import os
os.listdir("somedirectory")

Вернет список всех файлов и каталогов в "somedirectory".

799
csano 13 Июл 2016 в 22:05
10
Это возвращает относительный путь к файлам по сравнению с полным путем, возвращаемым glob.glob
 – 
xji
17 Май 2016 в 17:32
21
@JIXiang: os.listdir() всегда возвращает простые имена файлов (а не относительные пути). То, что возвращает glob.glob(), определяется форматом пути входного шаблона.
 – 
mklement0
30 Ноя 2016 в 21:14
Os.listdir () -> Он всегда отображает каталог и файл в указанном месте. Есть ли способ перечислить только каталог, а не файлы?
 – 
RonyA
22 Май 2018 в 18:44

Однострочное решение для получения только списка файлов (без подкаталогов):

filenames = next(os.walk(path))[2]

Или абсолютные пути:

paths = [os.path.join(path, fn) for fn in next(os.walk(path))[2]]
159
ohe 22 Сен 2019 в 23:40
7
Только однострочник, если вы уже import os. Мне кажется менее лаконичным, чем glob().
 – 
ArtOfWarfare
28 Ноя 2014 в 23:22
4
Проблема с glob заключается в том, что папка с именем something.something будет возвращена glob ('/ home / adam /*.*')
 – 
Remi
1 Дек 2014 в 12:08
5
В OS X есть нечто, называемое связкой. Это каталог, который обычно следует рассматривать как файл (например, .tar). Вы бы хотели, чтобы они рассматривались как файл или каталог? Использование glob() рассматривает его как файл. Ваш метод будет рассматривать его как каталог.
 – 
ArtOfWarfare
1 Дек 2014 в 22:44

Получение полных путей к файлам из каталога и всех его подкаталогов

import os

def get_filepaths(directory):
    """
    This function will generate the file names in a directory 
    tree by walking the tree either top-down or bottom-up. For each 
    directory in the tree rooted at directory top (including top itself), 
    it yields a 3-tuple (dirpath, dirnames, filenames).
    """
    file_paths = []  # List which will store all of the full filepaths.

    # Walk the tree.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Join the two strings in order to form the full filepath.
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  # Add it to the list.

    return file_paths  # Self-explanatory.

# Run the above function and store its results in a variable.   
full_file_paths = get_filepaths("/Users/johnny/Desktop/TEST")

  • Путь, который я указал в приведенной выше функции, содержал 3 файла - два из них в корневом каталоге, а другой в подпапке с именем «SUBFOLDER». Теперь вы можете делать такие вещи, как:
  • print full_file_paths, который распечатает список:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

При желании вы можете открывать и читать содержимое или сосредотачиваться только на файлах с расширением «.dat», как в приведенном ниже коде:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat

131
Johnny 26 Сен 2019 в 05:29
Это единственный ответ.
 – 
thelearner
13 Апр 2020 в 19:31

Начиная с версии 3.4 для этого есть встроенные итераторы , которые намного эффективнее, чем os.listdir():

pathlib: Новое в версии 3.4.

>>> import pathlib
>>> [p for p in pathlib.Path('.').iterdir() if p.is_file()]

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

os.scandir(): Новое в версии 3.5 .

>>> import os
>>> [entry for entry in os.scandir('.') if entry.is_file()]

Обратите внимание, что os.walk() использует os.scandir() вместо os.listdir() из версии 3.5, а его скорость увеличилась в 2-20 раз согласно PEP 471.

Позвольте мне также рекомендовать прочитать комментарий ShadowRanger ниже.

77
Peter Mortensen 23 Май 2018 в 21:41
1
Спасибо! Я думаю, что это единственное решение, которое не возвращает напрямую list. В качестве альтернативы можно использовать p.name вместо первого p, если это необходимо.
 – 
jeromej
22 Июн 2015 в 15:36
1
Добро пожаловать! Я бы предпочел генерировать экземпляры pathlib.Path(), поскольку у них есть много полезных методов, которые я не хотел бы тратить зря. Вы также можете позвонить им str(p), чтобы узнать имена путей.
 – 
SzieberthAdam
13 Июл 2015 в 17:56
6
Примечание. Решение os.scandir будет более эффективным, чем os.listdir, с проверкой os.path.is_file и т.п., даже если вам понадобится list (так что вы не получите от ленивой итерации), потому что os.scandir использует API, предоставляемые ОС, которые бесплатно предоставляют вам информацию is_file во время итерации, без обращения к диску для каждого файла, чтобы stat их вообще ( в Windows DirEntry предоставляют полную информацию stat бесплатно, в системах * NIX требуется stat для получения информации, помимо is_file, is_dir и т. д. ., но для удобства DirEntry кэшируется на первом stat).
 – 
ShadowRanger
21 Ноя 2015 в 01:38
1
Вы также можете использовать entry.name, чтобы получить только имя файла, или entry.path, чтобы получить его полный путь. Больше никаких os.path.join () повсюду.
 – 
user136036
28 Мар 2017 в 23:26

Мне очень понравился ответ Адама, в котором предлагается использовать glob() из одноименного модуля. Это позволяет вам иметь сопоставление с образцом с * s.

Но, как отмечали другие люди в комментариях, glob() может споткнуться из-за непоследовательных направлений косой черты. Чтобы помочь с этим, я предлагаю вам использовать функции join() и expanduser() в модуле os.path и, возможно, функцию getcwd() в модуле os, как хорошо.

В качестве примеров:

from glob import glob

# Return everything under C:\Users\admin that contains a folder called wlp.
glob('C:\Users\admin\*\wlp')

Вышеупомянутое ужасно - путь был жестко запрограммирован и будет работать только в Windows между именем диска и \, жестко запрограммированными в путь.

from glob    import glob
from os.path import join

# Return everything under Users, admin, that contains a folder called wlp.
glob(join('Users', 'admin', '*', 'wlp'))

Вышеуказанное работает лучше, но оно зависит от имени папки Users, которое часто встречается в Windows и не так часто встречается в других ОС. Он также полагается на то, что у пользователя есть определенное имя, admin.

from glob    import glob
from os.path import expanduser, join

# Return everything under the user directory that contains a folder called wlp.
glob(join(expanduser('~'), '*', 'wlp'))

Это отлично работает на всех платформах.

Еще один отличный пример, который отлично работает на разных платформах и делает кое-что другое:

from glob    import glob
from os      import getcwd
from os.path import join

# Return everything under the current directory that contains a folder called wlp.
glob(join(getcwd(), '*', 'wlp'))

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

48
Community 23 Май 2017 в 14:47
4
Дополнительное удовольствие: начиная с Python 3.5, ** работает, пока вы устанавливаете recursive = True. См. Документацию здесь: docs.python.org/3.5/library/glob .html # glob.glob
 – 
ArtOfWarfare
26 Янв 2015 в 06:24
def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 
35
Apogentus 7 Окт 2014 в 22:30

Если вы ищете Python-реализацию find , я довольно часто использую этот рецепт:

from findtools.find_files import (find_files, Match)

# Recursively find all *.sh files in **/usr/bin**
sh_files_pattern = Match(filetype='f', name='*.sh')
found_files = find_files(path='/usr/bin', match=sh_files_pattern)

for found_file in found_files:
    print found_file

Поэтому я сделал из него пакет PyPI, а также есть репозиторий GitHub. Я надеюсь, что кто-то сочтет это потенциально полезным для этого кода.

23
Peter Mortensen 29 Май 2017 в 02:17

Для лучших результатов вы можете использовать метод listdir() модуля os вместе с генератором (генератор - это мощный итератор, который сохраняет свое состояние, помните?). Следующий код отлично работает с обеими версиями: Python 2 и Python 3.

Вот код:

import os

def files(path):  
    for file in os.listdir(path):
        if os.path.isfile(os.path.join(path, file)):
            yield file

for file in files("."):  
    print (file)

Метод listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если данная запись является файлом. И оператор yield завершает выполнение функции, но сохраняет ее текущее состояние и возвращает только имя записи, обнаруженной как файл. Все вышесказанное позволяет нам перебрать функцию генератора.

14
Georgy 17 Май 2019 в 12:23

Возвращение списка абсолютных путей к файлам без рекурсии в подкаталоги

L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))]
11
Cristian Ciupitu 28 Дек 2014 в 06:27
2
Примечание: os.path.abspath(f) будет несколько более дешевой заменой os.path.join(os.getcwd(),f).
 – 
ShadowRanger
6 Май 2017 в 03:14
Я был бы еще более эффективным, если бы вы начали с cwd = os.path.abspath('.'), а затем использовали бы cwd вместо '.' и os.getcwd(), чтобы избежать множества избыточных системных вызовов.
 – 
Martijn Pieters♦
5 Дек 2018 в 13:46
import os
import os.path


def get_files(target_dir):
    item_list = os.listdir(target_dir)

    file_list = list()
    for item in item_list:
        item_dir = os.path.join(target_dir,item)
        if os.path.isdir(item_dir):
            file_list += get_files(item_dir)
        else:
            file_list.append(item_dir)
    return file_list

Здесь я использую рекурсивную структуру.

10
Andrew Rohne 18 Июл 2018 в 16:44
То же самое можно сделать всего в одной строке с помощью pathlib: filter(Path.is_file, Path().rglob('*'))
 – 
Georgy
17 Май 2019 в 12:37

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

Когда существует несколько устоявшихся способов сделать что-либо, ни один из них не подходит для всех случаев.

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

filenames = dir_filter('foo/baz', radical='radical', extension='.txt')

Если вы хотите сначала объявить две функции, это можно сделать:

def file_filter(filename, radical='', extension=''):
    "Check if a filename matches a radical and extension"
    if not filename:
        return False
    filename = filename.strip()
    return(filename.startswith(radical) and filename.endswith(extension))

def dir_filter(dirname='', radical='', extension=''):
    "Filter filenames in directory according to radical and extension"
    if not dirname:
        dirname = '.'
    return [filename for filename in os.listdir(dirname)
                if file_filter(filename, radical, extension)]

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

9
fralau 24 Мар 2019 в 10:17

Использование генераторов

import os
def get_files(search_path):
     for (dirpath, _, filenames) in os.walk(search_path):
         for filename in filenames:
             yield os.path.join(dirpath, filename)
list_files = get_files('.')
for filename in list_files:
    print(filename)
6
shantanoo 17 Май 2017 в 18:35

Другой очень читаемый вариант для Python 3.4+ - использование pathlib.Path.glob:

from pathlib import Path
folder = '/foo'
[f for f in Path(folder).glob('*') if f.is_file()]

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

[f for f in Path(folder).glob('**/*.py') if not f.is_symlink()]
4
Peter Mortensen 23 Май 2018 в 22:25

Вот моя универсальная функция для этого. Он возвращает список путей к файлам, а не имен файлов, поскольку я обнаружил, что это более полезно. У него есть несколько необязательных аргументов, которые делают его универсальным. Например, я часто использую его с такими аргументами, как pattern='*.txt' или subfolders=True.

import os
import fnmatch

def list_paths(folder='.', pattern='*', case_sensitive=False, subfolders=False):
    """Return a list of the file paths matching the pattern in the specified 
    folder, optionally including files inside subfolders.
    """
    match = fnmatch.fnmatchcase if case_sensitive else fnmatch.fnmatch
    walked = os.walk(folder) if subfolders else [next(os.walk(folder))]
    return [os.path.join(root, f)
            for root, dirnames, filenames in walked
            for f in filenames if match(f, pattern)]
3
MarredCheese 7 Дек 2017 в 23:10

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

[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]

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

2
Vinodh Krishnaraju 12 Дек 2017 в 08:30
1
Если вы собираетесь использовать glob, просто используйте glob('**/*.csv', recursive=True). Нет необходимости комбинировать это с os.walk() для рекурсии (recursive и ** поддерживаются, начиная с Python 3.5).
 – 
Martijn Pieters♦
5 Дек 2018 в 14:09

Для python2: pip install rglob

import rglob
file_list=rglob.rglob("/home/base/dir/", "*")
print file_list
2
chris-piekarski 19 Окт 2018 в 06:19

dircache устарел, начиная с версии 2.6: Модуль dircache был удален из Python 3.0. "

import dircache
list = dircache.listdir(pathname)
i = 0
check = len(list[0])
temp = []
count = len(list)
while count != 0:
  if len(list[i]) != check:
     temp.append(list[i-1])
     check = len(list[i])
  else:
    i = i + 1
    count = count - 1

print temp
1
Georgy 17 Май 2019 в 23:30
17
dirchache устарел, начиная с версии 2.6: модуль dircache имеет был удален в Python 3.0 ".
 – 
Daniel Reis
17 Авг 2013 в 17:58