Как перечислить все файлы каталога?

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

2298
задан duhhunjonn 08 июля '10 в 22:31
источник поделиться

25 ответов

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

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

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

Лично я предпочитаю .extend()

2353
ответ дан pycruft 09 июля '10 в 0:01
источник поделиться

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

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

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

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]
950
ответ дан adamk 09 июля '10 в 21:13
источник поделиться
import os
os.listdir("somedirectory")

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

416
ответ дан sepp2k 08 июля '10 в 22:35
источник поделиться

Самый быстрый способ получить список с текущими файлами каталога - Python 3

>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Самый быстрый способ получить список с текущими файлами каталога - Python 2

>>> import os
>>> arr = os.listdir('.')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Быстро с os.walk('.') только в текущем каталоге

>>> import os
>>> arr = next(os.walk('.'))[2]
>>> arr
['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

Быстрый способ получить полный путь к файлам в текущем каталоге

>>> import os
>>> path = os.getcwd()
>>> arr = []
>>> for files in next(os.walk(path))[2]:
>>>     arr.append(path + "\\" + files)
...
>>> for files in arr:
>>>     print(files)
...
F:\_moduli_economia\5bs_Turismo1.pdf
F:\_moduli_economia\5bs_Turismo1.pptx
F:\_moduli_economia\esperienza.txt

Более глубокий взгляд на: Как получить список файлов в Python 2 и 3?

Вот список того, о чем я говорил в этом ответе:

os. listdir() для Python 3
  • 1.1 - Использование определения списка для выбора только файлов txt
  • 1.2 - Использование os. path.isfile, чтобы избежать каталогов в списке

pathlib

os. ходить()

os. scandir()

python 2 (os. listdir())

4.1 - python 2.7 - os. walk ('.')

Пример использования os. walk ('.') для подсчета количества файлов в каталоге и его подкаталогах (для python 3.5 и 2.7)

с помощью glob

Бонус: поиск типа файлов и их копирование в каталоге


1. os.listdir() (python 3)


>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

1.1 - Использование определения списка для выбора только файлов txt

>>> arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
>>> print(arr_txt)
['work.txt', '3ebooks.txt']

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

import os.path

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

print(listOfFiles)

Выход

Здесь есть только файлы

['простой game.py', 'data.txt', 'decorator.py', 'deep_reverse_list.py', 'deep_reverse_list2.py', 'hangman.py', 'import pygame.py', ' list_click_display.py ',' os_path.py ']


2. Python 3.4 [pathlib]


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

Если вы хотите использовать понимание списка

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

3. Python 3.5 (и 2.7) [os.walk]


Чтобы включить все файлы в подкаталог (в этом примере есть 11 файлов в первом каталоге и 3 в подкаталоге), я буду использовать os.walk(), который работает в python 3.5 и более поздних версиях:

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)
print(y)
# print y # for 2.7 uncomment this and comment the previous line

Выход

['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
>>> next(os.walk('F://python'))[2] # for the current dir use ('.')
['calculator.bat','calculator.py']

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

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

- Получить корень со следующим и ходить в каталог

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

4. os.scandir() из python 3.5 на


>>> import os
>>> x = [f.name for f in os.scandir() if f.is_file()]
>>> x
['calculator.bat','calculator.py']

Другой пример с scandir (небольшая вариация от docs.python.org) Это более эффективно, чем os.listdir. В этом случае он показывает файлы только в текущем каталоге, где выполняется script.

>>> 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
>>>

5. Python 2


Используйте getcwd(), чтобы получить текущий рабочий каталог в python 2 (или ('.'))

>>> import os
>>> mylist = os.listdir(os.getcwd())
>>> mylist
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

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

>>> for f in os.listdir('..'):
...     print f


>>> for f in os.listdir('/'):
...     print f

список файлов с абсолютным путем

То же, что и в Python 3 (кроме печати)

>>> x = os.listdir('F:/python')
>>> for files in x:
>>>    print files
...
$RECYCLE.BIN
work.txt
3ebooks.txt
documents

5.1 - python 2 - os.walk('.')

Давайте сделаем пример для python 2.7 с прогулкой (такой же, как python 3).

>>> def getAllFiles(dir):
...     """Get all the files in the dir and subdirs"""
...     allfiles = []
...     for pack in os.walk(dir):
...         for files in pack[2]:
...             if os.path.isfile(files):
...                 allfiles += [files]
...     return allfiles
...
>>> getAllFiles("F://python")
['first.py', 'Modules.txt', 'test4Console.py', 'text4Console.bat', 'tkinter001.py']

6. Пример использования os.walk('.') Для python 3.5 и 2.7

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

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 файлов

7. Использование glob

>>> import glob
>>> glob.glob("*.txt")
['ale.txt', 'alunni2015.txt', 'assenze.text.txt', 'text2.txt', 'untitled.txt']

8. Бонус: найти файлы и скопировать их в пункт назначения

Немного script, который ищет во всех подкаталогах некоторых директорий (я выбираю те, у которых есть символ undescore в начале), принимает все типы файлов (pdf или pptx или txt ecc.) и копирует их в каталог назначения. Это полезно, если вы сделали много подкаталогов, и вы хотите взглянуть на все, что вы сделали... пусть говорят презентации, в одном месте, не задумываясь о том, где вы помещаете этот файл или другой. Мне жаль, что вы не найдете его полезным. Я использовал для своих целей.

import os
import shutil
from path import path

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


def copyfile(dir, filetype='pptx', counter=0):
    "Searches for pptx (or other) 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("------------------------")
        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
_compiti18\ottobre\3acc\compito.txt
_compiti18\ottobre\3acc\compito1530.txt
_compiti18\ottobre\3acc\compito1530_correttore.txt
_compiti18\ottobre\3acc\compito3825.txt
_compiti18\ottobre\3acc\compito3825_correttore.txt
_compiti18\ottobre\3acc\compito6028.txt
------------------------
==> Found in: `_compiti18` : 9 files
183
ответ дан Giovanni - Gianni - Gatto 03 янв. '17 в 18:36
источник поделиться

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

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

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

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]
134
ответ дан Remi 18 янв. '14 в 20:42
источник поделиться

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

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

104
ответ дан Johnny 11 окт. '13 в 3:55
источник поделиться

Поскольку версия 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 ниже.

52
ответ дан SzieberthAdam 18 июня '15 в 23:58
источник поделиться

Мне действительно понравился ответ adamk, предлагая использовать 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.

44
ответ дан ArtOfWarfare 09 июля '14 в 14:43
источник поделиться
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 
33
ответ дан Apogentus 10 июня '14 в 19:16
источник поделиться

Вы должны использовать модуль os для размещения содержимого каталога. os.listdir(".") возвращает все содержимое каталога. Мы перебираем результат и добавляем его в список.

import os

content_list = []

for content in os.listdir("."): # "." means current directory
    content_list.append(content)

print content_list
26
ответ дан Harun Ergül 23 марта '16 в 13:09
источник поделиться
import os
lst=os.listdir(path)

os.listdir возвращает список, содержащий имена записей в каталоге, заданном путем.

22
ответ дан Rajat Garg 07 июля '15 в 13:12
источник поделиться

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

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. Я надеюсь, что кто-то найдет это потенциально полезным для этого кода.

19
ответ дан Yauhen Yakimovich 10 апр. '14 в 17:09
источник поделиться

Python 3.5 представил новый, более быстрый метод для прохода по каталогу - os.scandir().

Пример:

for file in os.scandir('/usr/bin'):
    line = ''
    if file.is_file():
        line += 'f'
    elif file.is_dir():
        line += 'd'
    elif file.is_symlink():
        line += 'l'
    line += '\t'
    print("{}{}".format(line, file.name))
14
ответ дан enedil 17 янв. '16 в 21:17
источник поделиться

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

L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))]
13
ответ дан The2ndSon 13 июня '14 в 19:26
источник поделиться

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

import os
from os import path

files = [x for x in os.listdir(directory_path) if path.isfile(directory_path+os.sep+x)]

Здесь вы получаете список всех файлов в каталоге.

12
ответ дан shiminsh 29 авг. '15 в 20:44
источник поделиться
# -** coding: utf-8 -*-
import os
import traceback

print '\n\n'

def start():
    address = "/home/ubuntu/Desktop"
    try:
        Folders = []
        Id = 1
        for item in os.listdir(address):
            endaddress = address + "/" + item
            Folders.append({'Id': Id, 'TopId': 0, 'Name': item, 'Address': endaddress })
            Id += 1         

            state = 0
            for item2 in os.listdir(endaddress):
                state = 1
            if state == 1: 
                Id = FolderToList(endaddress, Id, Id - 1, Folders)
        return Folders
    except:
        print "___________________________ ERROR ___________________________\n" + traceback.format_exc()

def FolderToList(address, Id, TopId, Folders):
    for item in os.listdir(address):
        endaddress = address + "/" + item
        Folders.append({'Id': Id, 'TopId': TopId, 'Name': item, 'Address': endaddress })
        Id += 1

        state = 0
        for item in os.listdir(endaddress):
            state = 1
        if state == 1: 
            Id = FolderToList(endaddress, Id, Id - 1, Folders)
    return Id

print start()
8
ответ дан barisim.net 07 марта '14 в 13:28
источник поделиться

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

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 02 дек. '16 в 10:01
источник поделиться

Используйте эту функцию, если вы хотите различный тип файла или получить полный каталог.

import os
def createList(foldername, fulldir = True, suffix=".jpg"):
    file_list_tmp = os.listdir(foldername)
    #print len(file_list_tmp)
    file_list = []
    if fulldir:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(os.path.join(foldername, item))
    else:
        for item in file_list_tmp:
            if item.endswith(suffix):
                file_list.append(item)
    return file_list
5
ответ дан neouyghur 11 нояб. '16 в 15:48
источник поделиться

Если вам нужна производительность, попробуйте scandir, для Python 2.x вам может потребоваться установить его вручную. Примеры:

# python 2.x
import scandir
import sys

de = scandir.scandir(sys.argv[1])
while 1:
    try:
        d = de.next()
        print d.path
    except StopIteration as _:
        break

Это экономит много времени, когда вам нужно сканировать огромный каталог, вам не нужно буферизировать огромный список, просто выберите один за другим. А также вы можете сделать это рекурсивно:

def scan_path(path):
    de = scandir.scandir(path)
    while 1:
        try:
            e = de.next()
            if e.is_dir():
                scan_path(e.path)
            else:
                print e.path
        except StopIteration as _:
                break
5
ответ дан coanor 12 марта '16 в 12:31
источник поделиться
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
5
ответ дан shaji 25 июля '12 в 13:25
источник поделиться

Используя os библиотеку.

import os
for root, dirs,files in os.walk("your dir path", topdown=True):
    for name in files:
        print(os.path.join(root, name))
4
ответ дан Sankar Raj 15 окт. '16 в 19:29
источник поделиться
import os 
os.listdir(path)

Это вернет список всех файлов и каталогов в пути

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

Это вернет только список файлов, а не подкаталогов

3
ответ дан Ashiq Imran 18 окт. '17 в 9:46
источник поделиться

Ссылаясь на ответ @adamk, вот мой метод обнаружения os в ответ на комментарий несогласованности косой чертой от @Anti Earth

import sys
import os
from pathlib import Path
from glob import glob
platformtype = sys.platform
if platformtype == 'win32':
    slash = "\\"
if platformtype == 'darwin':
    slash = "/"

# TODO: How can I list all files of a directory in Python and add them to a list?

# Step 1 - List all files of a directory

# Method 1: Find only pre-defined filetypes (.txt) and no subfiles, answer provided by @adamk
dir1 = "%sfoo%sbar%s*.txt" % (slash)
_files = glob(dir1)

# Method 2: Find all files and no subfiles
dir2 = "%sfoo%sbar%s" % (slash)
_files = (x for x in Path("dir2").iterdir() if x.is_file())

# Method 3: Find all files and all subfiles
dir3 = "%sfoo%sbar" % (slash)
_files = (x for x in Path('dir3').glob('**/*') if x.is_file())


# Step 2 - Add them to a list

files_list = []
for eachfiles in _files:
    files_basename = os.path.basename(eachfiles)
    files_list.append(files_basename)

print(files_list)
['file1.txt', 'file2.txt', .... ]

Я предполагаю, что вы хотите только basenames в списке.

Обратитесь к этому сообщению для предварительного определения нескольких форматов файлов для метода 1.

0
ответ дан Joseph K. 22 окт. '17 в 4:52
источник поделиться

Вот простой пример:

import os
root, dirs, files = next(os.walk('.'))
for file in files:
    print(file) # In Python 3 use: file.encode('utf-8') in case of error.

Примечание. Измените . на значение или переменную пути.

Вот пример, возвращающий список файлов с абсолютными путями:

import os
path = '.' # Change this as you need.
abspaths = []
for fn in os.listdir(path):
    abspaths.append(os.path.abspath(os.path.join(path, fn)))
print("\n".join(abspaths))

Документация: os и os.path для Python 2, os и os.path для Python 3.

-1
ответ дан kenorb 26 мая '17 в 14:48
источник поделиться
ls -a

В этом списке будет отображаться только скрытый материал.

-8
ответ дан Evil Exists 06 июля '17 в 2:20
источник поделиться

Другие вопросы по меткам