Список только файлов в каталоге?

Есть ли способ перечислить файлы (не каталоги) в каталоге с Python? Я знаю, что я мог бы использовать os.listdir и цикл os.path.isfile() s, но если там что-то более простое (например, функция os.path.listfilesindir или что-то еще), вероятно, было бы лучше.

Ответы

Ответ 1

Это простое выражение генератора:

files = (file for file in os.listdir(path) 
         if os.path.isfile(os.path.join(path, file)))
for file in files: # You could shorten this to one line, but it runs on a bit.
    ...

Или вы могли бы сделать генераторную функцию, если она вам подходит:

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

Тогда просто:

for file in files(path):
    ...

Ответ 2

files = next(os.walk('..'))[2]

Ответ 3

Использование pathlib в Windows следующим образом:

files = (x для x в Path ( "ваш_path" ), если x.is_file())

Генерирует ошибку:

TypeError: объект "WindowsPath" не является итерируемым

Вам лучше использовать Path.iterdir()

filePath = Path("your_path")
if filePath.is_dir():
    files = list(x for x in filePath.iterdir() if x.is_file())

Ответ 4

Вы можете попробовать pathlib, в котором также есть много полезного материала.

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

from pathlib import *
files = (x for x in Path(".") if x.is_file())
for file in files:
    print(str(file), "is a file!")

Это, на мой взгляд, больше Pythonic, чем использование os.path.

Смотрите также: PEP 428.

Ответ 5

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

[x for x in Path("your_path").iterdir() if x.is_file()]

с поддержкой глубины, если это необходимо.

Ответ 6

Это даст только список файлов

import glob
#mydir is the location to search
files_only = glob.glob(mydir+'\\*.*')

Ответ 7

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

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

В противном случае в более общем случае пути к каталогам и имена файлов должны быть объединены:

dirpath = '~/path_to_dir_of_interest'
files = [f for f in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, f))]