Add optional 'onerror' argument to os.walk(), to control error

handling.
This commit is contained in:
Guido van Rossum 2003-05-13 18:01:19 +00:00
parent a2f7728341
commit bf1bef820c
3 changed files with 24 additions and 4 deletions

View File

@ -1054,7 +1054,8 @@ which is used to set the access and modified times, respectively.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}
\begin{funcdesc}{walk}{top\optional{, topdown\code{=True}}}
\begin{funcdesc}{walk}{top\optional{, topdown\code{=True}
\optional{, onerror\code{=None}}}}
\index{directory!walking}
\index{directory!traversal}
\function{walk()} generates the file names in a directory tree, by
@ -1087,6 +1088,13 @@ about directories the caller creates or renames before it resumes
false is ineffective, because in bottom-up mode the directories in
\var{dirnames} are generated before \var{dirnames} itself is generated.
By default errors from the \code{os.listdir()} call are ignored. If
optional argument \var{onerror} is specified, it should be a function;
it will be called with one argument, an os.error instance. It can
report the error to continue with the walk, or raise the exception
to abort the walk. Note that the filename is available as the
\code{filename} attribute of the exception object.
\begin{notice}
If you pass a relative pathname, don't change the current working
directory between resumptions of \function{walk()}. \function{walk()}

View File

@ -203,7 +203,7 @@ def renames(old, new):
__all__.extend(["makedirs", "removedirs", "renames"])
def walk(top, topdown=True):
def walk(top, topdown=True, onerror=None):
"""Directory tree generator.
For each directory in the directory tree rooted at top (including top
@ -232,6 +232,13 @@ def walk(top, topdown=True):
dirnames have already been generated by the time dirnames itself is
generated.
By default errors from the os.listdir() call are ignored. If
optional arg 'onerror' is specified, it should be a function; it
will be called with one argument, an os.error instance. It can
report the error to continue with the walk, or raise the exception
to abort the walk. Note that the filename is available as the
filename attribute of the exception object.
Caution: if you pass a relative pathname for top, don't change the
current working directory between resumptions of walk. walk never
changes the current directory, and assumes that the client doesn't
@ -259,7 +266,9 @@ def walk(top, topdown=True):
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = listdir(top)
except error:
except error, err:
if onerror is not None:
onerror(err)
return
dirs, nondirs = [], []
@ -274,7 +283,7 @@ def walk(top, topdown=True):
for name in dirs:
path = join(top, name)
if not islink(path):
for x in walk(path, topdown):
for x in walk(path, topdown, onerror):
yield x
if not topdown:
yield top, dirs, nondirs

View File

@ -38,6 +38,9 @@ Extension modules
Library
-------
- Added optional 'onerror' argument to os.walk(), to control error
handling.
- inspect.is{method|data}descriptor was added, to allow pydoc display
__doc__ of data descriptors.