In Java you can do File.listFiles()
and receive all of the files in a directory. You can then easily recurse through directory trees.
Is there an analogous way to do this in Python?
Python method walk() generates the file names in a directory tree by walking the tree either top-down or bottom-up.
Yes, there is. The Python way is even better.
There are three possibilities:
1) Like File.listFiles():
Python has the function os.listdir(path). It works like the Java method.
2) pathname pattern expansion with glob:
The module glob contains functions to list files on the file system using Unix shell like pattern, e.g.
files = glob.glob('/usr/joe/*.gif')
3) File Traversal with walk:
Really nice is the os.walk function of Python.
The walk method returns a generation function that recursively list all directories and files below a given starting path.
An Example:
You can even on the fly remove directories from "dirs" to avoid walking to that dir: if "joe" in dirs: dirs.remove("joe") to avoid walking into directories called "joe".
import os
from os.path import join
for root, dirs, files in os.walk('/usr'):
print "Current directory", root
print "Sub directories", dirs
print "Files", files
listdir and walk are documented here. glob is documented here.
As a long-time Pythonista, I have to say the path/file manipulation functions in the std library are sub-par: they are not object-oriented and they reflect an obsolete, lets-wrap-OS-system-functions-without-thinking philosophy. I'd heartily recommend the 'path' module as a wrapper (around os, os.path, glob and tempfile if you must know): much nicer and OOPy: http://pypi.python.org/pypi/path.py/2.2
This is walk() with the path module:
dir = path(os.environ['HOME'])
for f in dir.walk():
if f.isfile() and f.endswith('~'):
f.remove()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With