learnningprogramming
learnningprogramming

Reputation: 379

Getting sub directories list in a text file and append that txt file with new subdirectory name

I am trying to write a script which will list down all subdirectories in a directory into a txt file.

this script will run every 1 hour through cron job so that i can append to the txt file already created in previous run and add new subdir names.

For eg:

/Directory
  /subdir1
  /subdir2
  /subdir3

txt.file should have following columns:

subdir_name     timestamp   first_filenamein_thatSUBDIR
subdir1         2015-23-12  abc.dcm
subdir2         2014-23-6   ghj.nii
.
.
.

I know to get list of directories using os.listdir but don't know how to approach this problem as i want to write same txt file with new names. ANy idea how should i do that in python?

EDit: With os.listdir i am getting sub directories name but not the time stamp. And other problem is how can i create two columns one with sub directory name and other with its time stamp as shown above?

With @Termi's help i got this code working:

import time
import os
from datetime import datetime
parent_dir = '/dicom/'

sub_dirs = os.walk(parent_dir).next()[1]

with open('exam_list.txt','a+') as f:
    lines = f.readlines()
    present_dirs = [line.split('\t')[0] for line in lines]
    for sub in sub_dirs[1:len(sub_dirs)]:
    sub = sub + '/0001'
        latest_modified = os.path.getctime(os.path.join(parent_dir,sub))
        if sub not in present_dirs and time.time() - latest_modified < 4600 :
            created = datetime.strftime(datetime.fromtimestamp(latest_modified),'%Y-%d-%m')
            file_in_subdir = os.walk(os.path.join(parent_dir,sub)).next()[2][1]
            f.write("%s\t%s\t%s\n"%(sub,created,file_in_subdir))

This code, when typed on python terminal, works well with all the variables sub, created, file_in_subdir holding some value, however, is not able to write it in a file mentioned at the beginning of the code.

I also tried if file writing is a problem using following code:

with open('./exam_list.txt','a+') as f:
    f.write("%s\t%s\n"%(sub,file_in_subdir))

Above two lines creates file properly as i intended..

Not able to point out what is the error.

Upvotes: 2

Views: 635

Answers (3)

Termi
Termi

Reputation: 661

To get the immediate sub-directories in the parent directory use os.walk('path/to/parent/dir').next()[1].

os.walk().next() gives a list of lists as [current_dir, [sub-dirs], [files] ] so next()[1] gives sub-directories

opening the file with 'a+' will allow you to both read and append to the file. Then store the sub-directories that are already in the file

with open('dirname.txt','a+') as f:
    lines = f.readlines()
    present_dirs = [line.split('\t')[0] for line in lines]

Now for each sub-directory check whether it is already present in the list and if not, add it to the file. If you execute it every hour you can even check for new files created(or modified in linux systems) in the last hour by using getctime

time.time() - os.path.getctime(os.path.join(parent_dir,sub)) < 3600

Now for any new sub-directory use os.walk('path/to/subdir').next[2] and get the filenames inside

import time
import os
from datetime import datetime
parent_dir = '/path/to/parent/directory'

sub_dirs = os.walk(parent_dir).next()[1]

with open('dirname.txt','a+') as f:
    lines = f.readlines()
    present_dirs = [line.split('\t')[0] for line in lines]
    for sub in sub_dirs:

        latest_modified = os.path.getctime(os.path.join(parent_dir,sub))

        if sub not in present_dirs and time.time() - latest_modified < 3600 :

            created = datetime.strftime(datetime.fromtimestamp(latest_modified),'%Y-%d-%m')
            file_in_subdir = os.walk(os.path.join(parent_dir,sub)).next()[2][0]
            f.write("%s\t%s\t%s\n"%(sub,created,file_in_subdir))

Upvotes: 1

mrvol
mrvol

Reputation: 2983

You can use walk from os package. It's more better than listdir. You can read more about it here En Example:


import os
from os.path import join, getctime

with open('output.txt', 'w+') as output:

    for root, dirs, files in os.walk('/Some/path/'):
        for name in files:
            create_time = getctime(join(root, name))
            output.write('%s\t%s\t%s\n' % (root, name, create_time))

Upvotes: 1

janrn
janrn

Reputation: 80

with open('some.txt', 'a') as output:
    output.write('whatever you want to add')

Opening a file with 'a' as a parameter appends everything you write to it to its end.

Upvotes: 1

Related Questions