Список файлов ТОЛЬКО в текущем каталоге

226

В Python я хочу только перечислить все файлы в текущем каталоге ТОЛЬКО. Я не хочу, чтобы файлы перечислялись из любого подкаталога или родительского элемента

Кажется, есть похожие решения, но они не работают для меня. Вот мой фрагмент кода:

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Предположим, у меня есть 2 файла, holygrail.py и Tim внутри моего текущего каталога. У меня также есть папка, и она содержит два файла - назовем их Артур и Ланселот - внутри нее. Когда я запускаю скрипт, вот что я получаю:

holygrail.py
Tim
Arthur
Lancelot

Я счастлив с holygrail.py и Тимом. Но два файла, Артур и Ланселот, я не хочу перечислять.

slam_duncan
источник

Ответы:

379

Просто используйте os.listdirи os.path.isfileвместо os.walk.

Пример:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

Но будьте осторожны, применяя это к другому каталогу, как

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

который не будет работать, потому что fэто не полный путь, а относительно текущего каталога.

Поэтому для фильтрации в другом каталоге выполните os.path.isfile(os.path.join(somedir, f))

(Спасибо Causality за подсказку)

леность
источник
3
Это то, что мне было нужно в конце концов[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
citynorman
2
Это его ответ: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Джефф Лайет
64

Вы можете использовать os.listdirдля этой цели. Если вам нужны только файлы, а не каталоги , вы можете отфильтровать результаты, используя os.path.isfile.

пример:

files = os.listdir(os.curdir)  #files and directories

или

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # files only
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] #list comprehension version.
mgilson
источник
20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
Насимуддин Ансари
источник
3
Спасибо за общее решение (в случае, когда каталог не является cwd).
JWG
10

Вы можете использовать os.scandir(). Новая функция в stdlib начинается с Python 3.5.

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

Быстрее чем os.listdir(). os.walk() инвентарь os.scandir() .

prasastoadi
источник
5

это можно сделать с помощью os.walk ()

протестирован Python 3.5.2;

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

удалите строку dirs.clear (), и файлы в подпапках снова будут включены.

обновлять ссылками ;

os.walk задокументирован здесь и рассказывает о создаваемом тройном списке и эффектах сверху вниз .

.clear () задокументирован здесь для очистки списка

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

2114L3
источник
4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Вы можете улучшить этот код, с del dirs[:]которым будет похоже на следующее.

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

Или даже лучше, если вы можете указать os.walk с текущим рабочим каталогом.

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file
Озгур Оз
источник
3

вместо того os.walk, чтобы просто использоватьos.listdir

Инбар Роуз
источник
1

Вы можете использовать модуль pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Pygirl
источник