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

В 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 и Тимом. Но два файла, Артур и Ланселот, я не хочу перечислять.

Ответ 1

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

Пример:

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 за подсказку)

Ответ 2

Вы можете использовать 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.

Ответ 3

import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

Ответ 4

Вы можете использовать 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().

Ответ 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, вы можете выполнить его результат в соответствии с вашими потребностями.

Ответ 6

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

Ответ 7

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

Ответ 8

Мое решение:

import re
p = re.compile('[a-z]+', re.IGNORECASE)
words = p.findall("Hello, world! I'm a coder")

Я думаю, что это решение лучше