source: TI02-CSML/trunk/csml/csmllibs/csmldirectory.py @ 3286

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/csmllibs/csmldirectory.py@3286
Revision 3286, 6.0 KB checked in by domlowe, 13 years ago (diff)

overhaul of scanning command args

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/bin/env python
2import os,sys
3try:
4    import nappy 
5except ImportError:
6    pass
7    #sys.stdout.write('Could not import NASAAmes interface')
8import sys
9import string
10
11
12class DirectoryTree(object):
13        ''' Represents a directory'''
14        def __init__(self, topdir):
15            ''' sets the topdir attribute and reads the directory'''
16            self.subdirlist=[]
17            self.topdir=topdir
18            self._readDirectory()
19               
20
21        def readSubDir(self, subdir):   
22                for item in os.listdir(subdir):
23                        #print os.path.join(subdir, item)
24                        if os.path.isfile(os.path.join(subdir,item)):
25                                #print 'file: '+ item
26                                pass
27                        else:
28                            if item[0]=='.':
29                                pass # directory is hidden, ignore
30                            else:
31                                self.subdirlist.append(os.path.join(subdir, item))
32                                self.readSubDir(os.path.join(subdir, item))
33                #subdircount=len(self.subdirlist)
34                #print subdircount
35
36               
37        def _readDirectory(self):
38                ''' read directory and add listing of files to subdirlist'''
39                self.subdirlist.append(self.topdir)
40                for item in os.listdir(self.topdir):
41                        if os.path.isfile(os.path.join(self.topdir,item)):
42                                pass
43                        else:
44                            if item[0]=='.':
45                                pass # directory is hidden, ignore
46                            else:
47                                self.subdirlist.append(os.path.join(self.topdir, item))
48                                self.readSubDir(os.path.join(self.topdir, item))               
49
50        def getSubDirectories(self):
51                ''' get subdirectories in the file - note the first (0) entry in the sub directory list is
52                actually the top level directory'''
53                return self.subdirlist
54       
55        def getFilesInSubDir(self,sub):
56                ''' get files in a sub directory'''
57                filelist=[]
58                for item in os.listdir(sub):
59                        if os.path.isfile(os.path.join(sub,item)):
60                                filelist.append(os.path.join(sub,item))
61                return filelist
62                       
63        def getFirstInSubDir(self,sub):
64                ''' get first file in a sub directory'''
65                for item in os.listdir(sub):
66                        filename=os.path.join(sub,item)
67                        if os.path.isfile(filename):
68                                if self._isCSMLSupported(filename):
69                                        return filename
70               
71                                       
72        def getCSMLSupportedFilesInSubDir(self,sub):
73                ''' get files in sub directory that can be read for CSML content'''
74                filelist=[]
75                for item in os.listdir(sub):
76                        filename=os.path.join(sub,item)
77                        if os.path.isfile(filename):
78                                if self._isCSMLSupported(filename):
79                                        filelist.append(filename)
80                return filelist
81       
82        def getAllCSMLFilesExceptFirst(self,sub):
83                ''' get all the files that can be read for CSML content except the first one'''
84                filelist=self.getCSMLSupportedFilesInSubDir(sub)
85                filelist=filelist[1:]
86                return filelist
87       
88        def getAllCSMLSupportedFiles(self):
89                ''' get all the files that can be read for CSML content'''
90                filelist=[]
91                for subdir in self.subdirlist:
92                        for item in os.listdir(subdir):
93                                itempath=os.path.join(subdir,item)
94                                if os.path.isfile(itempath):
95                                        if self._isCSMLSupported(itempath):
96                                                filelist.append(itempath)
97                                else:
98                                        pass
99                return filelist
100                                       
101        def _isCSMLSupported(self,filename):
102            '''function to find if file is of a supported CSML type.'''
103            fileExtension = str(filename)[-3:]
104            supported = False
105           
106            try:
107                if fileExtension == '.nc':
108                        supported = True
109                elif fileExtension == '.pp':
110                        supported = True
111                elif fileExtension == 'ctl':
112                        supported = True
113                elif fileExtension == 'xml':
114                #this could be a CDML file. Only way to see is to open it.
115                    f=open(filename, 'r')
116                    f.readline() #read first line, now read docstring on second line
117                    line2=f.readline()
118                    if string.find(line2,'http://www-pcmdi.llnl.gov/software/cdms/cdml.dtd') > -1:
119                        supported = True
120                        f.close()
121                elif nappy.readFFI(filename) in [1001,1010,1020,2010,2110,2160,2310,3010,4010]:
122                        supported = True
123            except:
124                    #the nappy.readFFI function can fail if permissions are wrong (for example)
125                    supported=False
126            return supported
127                       
128class VirtualDirectoryTree(DirectoryTree):
129    '''  Given a list of file paths this class creates a tree that has the same interfaces as a DirectoryTree. It allows arbitrary collections of CSML files to be scanned. It behaves as if the files are all in a single directory with no subdirectories.''' 
130    def __init__(self, filelist):
131        ''' sets the topdir attribute and reads the directory'''
132        self.subdirlist=['virtualdirectorytree']
133        self.filelist=filelist
134
135    def readSubDir(self, subdir):       
136        pass
137           
138    def _readDirectory(self):
139        pass
140   
141    def getFilesInSubDir(self,sub):
142            ''' get files in a sub directory - there is only one directory so always returns the filelist'''
143            return self.filelist
144                   
145    def getFirstInSubDir(self,sub):
146            ''' get first file in a sub directory'''
147            return self.filelist[0]
148                                   
149    def getCSMLSupportedFilesInSubDir(self,sub):
150            ''' get files in sub directory that can be read for CSML content'''
151            validatedfiles=[]
152            for file in self.filelist:
153                if self._isCSMLSupported(file):
154                    validatedfiles.append(file)
155            return validatedfiles
156   
157    def getAllCSMLFilesExceptFirst(self,sub):
158            ''' get all the files that can be read for CSML content except the first one'''
159            filelist=self.filelist[1:]
160            return filelist
161   
162    def getAllCSMLSupportedFiles(self):
163            ''' get all the files that can be read for CSML content'''
164            return self.getCSMLSupportedFilesInSubDir('virtualdirectorytree')
Note: See TracBrowser for help on using the repository browser.