slam_duncan
slam_duncan

Reputation: 3668

List files ONLY in the current directory

In Python, I only want to list all the files in the current directory ONLY. I do not want files listed from any sub directory or parent.

There do seem to be similar solutions out there, but they don't seem to work for me. Here's my code snippet:

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

Let's suppose I have 2 files, holygrail.py and Tim inside my current directory. I have a folder as well and it contains two files - let's call them Arthur and Lancelot - inside it. When I run the script, this is what I get:

holygrail.py
Tim
Arthur
Lancelot

I am happy with holygrail.py and Tim. But the two files, Arthur and Lancelot, I do not want listed.

Upvotes: 337

Views: 602173

Answers (10)

Georg3.14159265
Georg3.14159265

Reputation: 56

Following up on Pygirl and Flimm, use of pathlib, (really helpful reference, btw) their solution included the full path in the result, so here is a solution that outputs just the file names:

from pathlib import Path
p = Path(destination_dir) # destination_dir = './' in original post
files = [x.name for x in p.iterdir() if x.is_file()]
print(files)

Upvotes: 1

Nir
Nir

Reputation: 1904

To list files in a specific folder excluding files in its sub-folders with os.walk use:

_, _, file_list = next(os.walk(data_folder))

Upvotes: 0

sloth
sloth

Reputation: 101142

Just use os.listdir and os.path.isfile instead of os.walk.

Example:

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

But be careful while applying this to other directory, like

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

which would not work because f is not a full path but relative to the current directory.

Therefore, for filtering on another directory, do os.path.isfile(os.path.join(somedir, f))

(Thanks Causality for the hint)

Upvotes: 552

Pygirl
Pygirl

Reputation: 13349

You can use the pathlib module.

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

Upvotes: 16

mgilson
mgilson

Reputation: 310097

You can use os.listdir for this purpose. If you only want files and not directories, you can filter the results using os.path.isfile.

example:

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

or

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.

Upvotes: 92

Ozgur Oz
Ozgur Oz

Reputation: 890

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

You can improve this code with del dirs[:]which will be like following .

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

Or even better if you could point os.walk with current working directory .

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

Upvotes: 5

2114L3
2114L3

Reputation: 564

this can be done with os.walk()

python 3.5.2 tested;

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)

remove the dirs.clear() line and the files in sub folders are included again.

update with references;

os.walk documented here and talks about the triple list being created and topdown effects.

.clear() documented here for emptying a list

so by clearing the relevant list from os.walk you can effect its result to your needs.

Upvotes: 7

prasastoadi
prasastoadi

Reputation: 2876

You can use os.scandir(). New function in stdlib starts from Python 3.5.

import os

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

Faster than os.listdir(). os.walk() implements os.scandir().

Upvotes: 19

Nasimuddin Ansari
Nasimuddin Ansari

Reputation: 647

import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]

Upvotes: 30

Inbar Rose
Inbar Rose

Reputation: 43477

instead of os.walk, just use os.listdir

Upvotes: 3

Related Questions