# [Tutor] tree problem

Roelof Wobben rwobben at hotmail.com
Sun Sep 12 19:52:07 CEST 2010

```

________________________________
> Date: Sun, 12 Sep 2010 13:40:09 -0400
> Subject: Re: [Tutor] tree problem
> From: joel.goldstick at gmail.com
> To: rwobben at hotmail.com
>
>
>
> On Sun, Sep 12, 2010 at 1:20 PM, Roelof Wobben
>> wrote:
>
>
>
> ________________________________
>> Date: Sun, 12 Sep 2010 11:59:07 -0400
>> From: joel.goldstick at gmail.com
>> To: tutor at python.org
>> Subject: Re: [Tutor] tree problem
>>
>>
>>
>> On Sun, Sep 12, 2010 at 10:48 AM, Roelof Wobben
>>> 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
>>
>>
>> _______________________________________________ Tutor maillist -
>> Tutor at python.org To unsubscribe or change
> subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>
>
> Hello,
>
> The rule takes care about that the filename is printed with a newline.
>
> Correct, f,d and s were variables used by the tree programm and can all
> be deleted.
>
> Then the traverse function looks like this:
>
> def traverse(path):
> test = ""
> file = os.path.join(path,'trash.txt')
> myfile = open (file, 'w')
> myfile.close()
> dirlist = getdirlist(path)
> dirsize = len(dirlist)
> for num, file in enumerate(dirlist):
> path2file = os.path.join(path, file)
> if os.path.isdir(path2file):
> test = traverse(path2file)
> return
>
> Roelof
>
>
> or even this:
> def traverse(path):
> ## this does nothing test = ""
> file = os.path.join(path,'trash.txt')
> myfile = open (file, 'w')
> myfile.close()
> dirlist = getdirlist(path)
> dirsize = len(dirlist)
> ## no need for num or enumerate for num, file in enumerate(dirlist):
> for file in dirlist:
> path2file = os.path.join(path, file)
> if os.path.isdir(path2file):
> ## no need for test.. it holds non test = traverse(path2file)
> traverse(path2file)
> return
>
>
> good luck
> --
> Joel Goldstick
>

Oke, Thanks everybody for the help.

Roelof

```