Список файлів ТОЛЬКО у поточному каталозі


225

У Python я хочу лише перелічити всі файли в поточному каталозі ТІЛЬКИ. Я не хочу, щоб файли, перелічені з будь-якого підкаталогу чи батьківства.

Там, схоже, є подібні рішення, але вони, здається, не працюють на мене. Ось мій фрагмент коду:

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

Припустимо, у мене є два файли, Holygrail.py та Тім у моєму поточному каталозі. У мене також папка, і вона містить два файли - назвемо їх Артур та Ланселот - всередині неї. Коли я запускаю сценарій, я отримую ось що:

holygrail.py
Tim
Arthur
Lancelot

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

Відповіді:


378

Просто використовуйте 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це не повний шлях, але відносно поточного dir.

Тому для фільтрації в інший каталог виконайте це os.path.isfile(os.path.join(somedir, f))

(Спасибі За причинність за підказку)


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))]'
Jeff Luyet

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.

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


5

це можна зробити за допомогою os.walk ()

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


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


1

Можна використовувати модуль pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.