SADECE geçerli dizindeki dosyaları listele


227

Python'da, yalnızca geçerli dizindeki tüm dosyaları SADECE listelemek istiyorum. Herhangi bir alt dizinden veya üst dizinden listelenen dosyaları istemiyorum.

Orada benzer çözümler var gibi görünüyor, ama onlar benim için çalışmıyor gibi görünüyor. İşte kod snippet'im:

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

Farzedelim ki 2 dizinim var, holygrail.py ve Tim şu anki dizinin içinde. Benim de bir klasörüm var ve içinde iki dosya var - hadi onlara Arthur ve Lancelot diyelim - içinde. Senaryoyu çalıştırdığımda, elde ettiğim şey bu:

holygrail.py
Tim
Arthur
Lancelot

Holygrail.py ve Tim ile mutluyum. Ama iki dosya, Arthur ve Lancelot, listelenmesini istemiyorum.

Yanıtlar:


380

Sadece os.listdirve os.path.isfileyerine kullanın os.walk.

Misal:

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

Ancak bunu başka bir dizine uygularken dikkatli olun.

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

ki bu ftam bir yol değil, mevcut yönteme göre çalışır.

Bu nedenle, başka bir dizine filtre uygulamak için os.path.isfile(os.path.join(somedir, f))

( İpucu için teşekkürler Nedensellik )


3
Sonunda ihtiyacım olan şey bu[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
Bu onun cevabı:files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet

64

os.listdirBu amaçla kullanabilirsiniz . Dizinleri değil , yalnızca dosyaları istiyorsanız sonuçları kullanarak filtreleyebilirsiniz .os.path.isfile

misal:

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

veya

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
Genel çözümü verdiğiniz için teşekkürler (dir'ün cwd olmadığı durumda).
jwg

10

Kullanabilirsiniz os.scandir(). Stdlib'deki yeni işlev Python 3.5'ten başlar.

import os

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

Daha hızlı os.listdir(). os.walk() uygular os.scandir() .


5

bu os.walk () ile yapılabilir

test edilen 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 () satırını kaldırdığınızda alt klasörlerdeki dosyalar tekrar eklenir.

referanslarla güncelleme ;

os.walk burada belgelendi ve oluşturulan üçlü liste ve yukarıdan aşağıya etkileri hakkında konuşuyor.

Bir listeyi boşaltmak için burada belgelenen .clear ()

böylece ilgili listeyi os.walk'tan silerek, sonucunu ihtiyaçlarınıza göre etkileyebilirsiniz.


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

del dirs[:]Aşağıdaki gibi olacak bu kodu geliştirebilirsiniz .

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

Ya da os.walk'u mevcut çalışma diziniyle gösterebilirseniz daha da iyi olur.

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 modülünü kullanabilirsiniz.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.