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.

8 Answers

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 dir.

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

(Thanks Causality for the hint)

2

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. 
1
import os destdir = '/var/tmp/testdir' files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ] 
1

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().

You can use the pathlib module.

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

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.

0
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 

instead of os.walk, just use os.listdir

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like