# [Tutor] tree problem

Joel Goldstick joel.goldstick at gmail.com
Sun Sep 12 17:59:07 CEST 2010

```On Sun, Sep 12, 2010 at 10:48 AM, Roelof Wobben <rwobben at hotmail.com> wrote:

>
>
>
> ________________________________
> > Date: Sun, 12 Sep 2010 09:46:08 -0400
> > From: joel.goldstick at gmail.com
> > To: tutor at python.org
> > Subject: Re: [Tutor] tree problem
> >
> >
> >
> > On Sun, Sep 12, 2010 at 9:32 AM, Roelof Wobben
> >> wrote:
> >
> >
> > ________________________________
> >> Date: Sun, 12 Sep 2010 09:08:18 -0400
> >> From: joel.goldstick at gmail.com
> >> To: tutor at python.org
> >
> >> Subject: Re: [Tutor] tree problem
> >>
> >>
> >>
> >> On Sun, Sep 12, 2010 at 7:54 AM, Lie Ryan
> >>> wrote:
> >> On 09/12/10 21:15, Roelof Wobben wrote:
> >>>
> >>>
> >>> Hello,
> >>>
> >>> I have this problem.
> >>>
> >>> Write a program named litter.py that creates an empty file named
> >> trash.txt in each subdirectory of a directory tree given the root of
> >> the tree as an argument (or the current directory as a default).
> >>
> >> By default, Python has a recursion limit of 1000 deep; that is, your
> >> function is calling itself 1000 times without returning.
> >>
> >> In this case, the only reason why you hit the recursion limit is if you
> >> have a directory which is 1000 deep (quite unlikely, Windows has a
> >> directory depth limit much lower than that).
> >>
> >> Or your function somehow never returns, in a typical recursive function,
> >> it's usually because you have problem in the precondition.
> >>
> >> You really have two problems here:
> >>
> >> 1. You need to know how to write an empty file with the name
> >> litter.py. You should probably write a function to see if you can do
> >> that. That's pretty easy
> >>
> >> 2. You need to traverse a tree. I see you are using os module. You
> >> should try help(os) while in your python shell to learn what methods
> >> are available. Traversing a tree is also sometimes called 'walking'
> >>
> >> good luck
> >>
> >>
> >> --
> >> Joel Goldstick
> >>
> >>
> >> _______________________________________________ Tutor maillist -
> >
> >> Tutor at python.org To unsubscribe or change
> > subscription options:
> >> http://mail.python.org/mailman/listinfo/tutor
> >
> > Hello Joel.
> >
> > Youre right.
> > Problem 1 is easily solved by using myfile = open ('filename', 'w')
> > followed by myfile.close()
> >
> > Problem 2 is more difficult.
> >
> > I have to use recursion and as example the source of the tree command
> > in linux is given.
> > The traverse module looks like this :
> >
> > def traverse(path, prefix='|--', s='.\n', f=0, d=0):
> >
> > what's up with the prefix???
> >
> > dirlist = getdirlist(path)
> > for num, file in enumerate(dirlist):
> >
> > why are you using enumerate? it gives you num which you never use
> > for file in dirlist gives what you seem to be using
> > lastprefix = prefix[:-3] + '``--'
> > dirsize = len(dirlist)
> > if num < dirsize - 1:
> > s += '%s %s\n' % (prefix, file)
> > else:
> > s += '%s %s\n' % (lastprefix, file)
> > path2file = os.path.join(path, file)
> >
> > if os.path.isdir(path2file):
> > d += 1
> > if getdirlist(path2file):
> > s, f, d = traverse(path2file, '| ' + prefix, s, f, d)
> > else:
> > f += 1
> > return s, f, d
> >
> > For me it looks like the pathfile = os.path.join(path, file)
> > and then the s.f.d. rule take care that a subdir is entered.
> > what are s.f.d. Can you use more descriptive names
> >
> > Am I right on this ?
> >
> > Roelof
> >
> >
> >
> >
> >
> > --
> > Joel Goldstick
> >
> >
> > _______________________________________________ Tutor maillist -
> > Tutor at python.org To unsubscribe or change subscription options:
> > http://mail.python.org/mailman/listinfo/tutor
>
> Hello,
>
> I solved this by this programm :
>
> import os
> import sys
>
> def getroot():
>    if len(sys.argv) == 1:
>        path = ''
>    else:
>        path = sys.argv[1]
>    if os.path.isabs(path):
>        tree_root = path
>    else:
>        tree_root = os.path.join(os.getcwd(), path)
>    return tree_root
>
> def getdirlist(path):
>    dirlist = os.listdir(path)
>     dirlist = [name for name in dirlist if name[0] != '.']
>    dirlist.sort()
>    return dirlist
>
> def traverse(path, s='.\n', f=0, d=0):
>    file = os.path.join(path,'trash.txt')
>    myfile = open (file, 'w')
>    myfile.close()
>     dirlist = getdirlist(path)
>    for num, file in enumerate(dirlist):
>         dirsize = len(dirlist)
>        if num < dirsize - 1:
>             s += '%s \n' % (file)
>        else:
>             s += '%s \n' % (file)
>         path2file = os.path.join(path, file)
>        if os.path.isdir(path2file):
>            d += 1
>             s, f, d = traverse(path2file, '|   ' + s, f, d)
>    return s,f,d
>
> if __name__ == '__main__':
>    root =  getroot()
>    tree_str, files, dirs = traverse(root)
>
>
> Roelof
>
>
Good for you.  Some questions:

What do you mean to be happening here:

if num < dirsize - 1:
s += '%s \n' % (file)
else:
s += '%s \n' % (file)

it does the same thing in either case

What exactly does s do for you?

You use the first parameter 'path' in your calls to traverse, but  I don't
see how you are using f or d anywhere either
--
Joel Goldstick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100912/7aaf0e33/attachment.html>
```