В 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")
Я думаю, что это решение лучше