Lista plików TYLKO w bieżącym katalogu


225

W Pythonie chcę tylko wyświetlić listę wszystkich plików w bieżącym katalogu. Nie chcę, aby pliki były wymienione z dowolnego podkatalogu lub nadrzędnego.

Wydaje się, że istnieją podobne rozwiązania, ale wydaje się, że nie działają one dla mnie. Oto mój fragment kodu:

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

Załóżmy, że mam 2 pliki, holygrail.py i Tim w moim bieżącym katalogu. Mam również folder, który zawiera dwa pliki - nazwijmy je Arthur i Lancelot - wewnątrz niego. Po uruchomieniu skryptu otrzymuję:

holygrail.py
Tim
Arthur
Lancelot

Cieszę się z holygrail.py i Tim. Ale dwa akta, Arthur i Lancelot, nie chcę na liście.

Odpowiedzi:


378

Po prostu użyj os.listdiri os.path.isfilezamiast os.walk.

Przykład:

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

Ale zachowaj ostrożność, stosując to do innego katalogu, takiego jak

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

co nie działałoby, ponieważ fnie jest to pełna ścieżka, ale w stosunku do bieżącego reż.

Dlatego, aby filtrować w innym katalogu, wykonaj os.path.isfile(os.path.join(somedir, f))

(Dzięki przyczynowości za podpowiedź)


3
Właśnie tego potrzebowałem w końcu[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
Oto jego odpowiedź: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet,

64

Możesz użyć os.listdirdo tego celu. Jeśli chcesz tylko pliki, a nie katalogi , możesz filtrować wyniki za pomocą os.path.isfile.

przykład:

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

lub

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
Dziękujemy za podanie ogólnego rozwiązania (w przypadku, gdy katalog nie jest plikiem cwd).
jwg

10

Możesz użyć os.scandir(). Nowa funkcja w stdlib zaczyna się od Python 3.5.

import os

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

Szybciej niż os.listdir(). os.walk() wdraża os.scandir() .


5

można to zrobić za pomocą os.walk ()

przetestowano 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)

usuń wiersz dirs.clear (), a pliki w podfolderach zostaną ponownie uwzględnione.

aktualizacja z referencjami ;

dokumentacja os.walk tutaj i mówi o tworzeniu potrójnej listy i efektach topdown.

.clear () udokumentowano tutaj, aby opróżnić listę

usuwając odpowiednią listę z os.walk, możesz dostosować jej wynik do swoich potrzeb.


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

Możesz ulepszyć ten kod, dzięki del dirs[:]czemu będzie to wyglądało następująco.

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

Lub jeszcze lepiej, jeśli możesz wskazać os.walk za pomocą bieżącego katalogu roboczego.

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

Możesz użyć modułu pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.