Alleen bestanden in de huidige map weergeven

In Python wil ik ALLEEN alle bestanden in de huidige map weergeven. Ik wil niet dat bestanden uit een submap of bovenliggende map worden weergegeven.

Er lijken vergelijkbare oplossingen te zijn, maar ze lijken niet te werken voor mij. Hier is mijn codefragment:

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

Stel dat ik 2 bestanden heb, holygrail.py en Tim in mijn huidige directory. Ik heb ook een map en daarin staan twee bestanden – laten we ze Arthur en Lancelot noemen. Als ik het script uitvoer, krijg ik dit:

holygrail.py
Tim
Arthur
Lancelot

Ik ben blij met holygrail.py en Tim. Maar de twee bestanden, Arthur en Lancelot, wil ik niet vermeld hebben.


Antwoord 1, autoriteit 100%

Gebruik gewoon os.listdiren os.path.isfilein plaats van os.walk.

Voorbeeld:

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

Maar wees voorzichtig bij het toepassen van dit op andere directory’s, zoals

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

wat niet zou werken omdat fgeen volledig pad is, maar relatief ten opzichte van de huidige map.

Daarom, om te filteren op een andere directory, doe os.path.isfile(os.path.join(somedir, f))

(Bedankt Causalityvoor de hint)


Antwoord 2, autoriteit 16%

U kunt hiervoor os.listdirgebruiken. Als u alleen bestandenen niet directorieswilt, kunt u de resultaten filteren met os.path.isfile.

voorbeeld:

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

of

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.

Antwoord 3, autoriteit 6%

import os
destdir = '/var/tmp/testdir'
files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

Antwoord 4, autoriteit 3%

U kunt os.scandir(). Nieuwe functie in stdlib begint vanaf Python 3.5.

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

Sneller dan os.listdir(). os.walk()implementeertos.scandir().


Antwoord 5, autoriteit 2%

dit kan met os.walk()

python 3.5.2 getest;

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)

verwijder de regel dirs.clear() en de bestanden in submappen worden weer opgenomen.

update met referenties;

os.walkhier gedocumenteerd en vertelt over de triple lijst die wordt gemaakt en effecten van bovenaf.

.clear()hier gedocumenteerd voor het legen van een lijst

Dus door de relevante lijst van os.walk te wissen, kunt u het resultaat naar uw wensen aanpassen.


Antwoord 6

U kunt de pathlib-module gebruiken.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))

Antwoord 7

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

Je kunt deze code verbeteren met del dirs[:]wat als volgt zal zijn.

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

Of nog beter als je os.walk zou kunnen wijzen met de huidige werkmap .

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

Antwoord 8

gebruik in plaats van os.walkgewoon os.listdir

Other episodes