NCCOOS Trac Projects: Top | Web | Platforms | Processing | Viz | Sprints | Sandbox | (Wind)

root/qscatv4/trunk/ascat.py

Revision 482 (checked in by cbc, 12 years ago)

Fixed usage docstring again.

  • Property svn:executable set to *
Line 
1 #!/usr/bin/python
2
3 r"""
4 Fetch and extract Ifremer ASCAT Daily NetCDF files.
5
6 Usage:
7     python ascat.py start_year start_month start_day \
8                     end_year   end_month   end_day
9
10 Where:
11     start_year  is YYYY format,
12     start_month is 1-12 for Jan-Dec,
13     start_day   is 1-31,
14     end_year    is YYYY format,             
15     end_month   is 1-12 for Jan-Dec,
16     end_day     is 1-31.
17 """
18
19 __author__    = 'Chris Calloway'
20 __email__     = 'cbc@unc.edu'
21 __copyright__ = 'Copyright 2012 UNC-CH Dept. of Marine Sciences'
22 __license__   = 'GPL2'
23
24 import os
25 import sys
26 import traceback
27 import calendar
28 import ftplib
29 import bz2
30
31 ftp_server = 'ftp.ifremer.fr'
32 ftp_user   = 'anonymous'
33 ftp_pass   = 'cbc@unc.edu'
34 ftp_dir    = 'ifremer/cersat/products/gridded/MWF/L3/ASCAT/Daily/Netcdf/'
35
36 work_dir   = os.path.join(os.path.sep,
37                           'afs',
38                           'isis.unc.edu',
39                           'depts',
40                           'marine',
41                           'workspace',
42                           'hseim',
43                           'volumes',
44                           'vol1',
45                           'nc_wind_2011',
46                           'satellite')
47 base_subdir = os.path.join('ascat', 'daily')
48 year_spec   = '%(year)4u'
49 month_spec  = '%(month)02u'
50 day_spec    = '%(day)02u'
51
52 def _fetch(f):
53     """
54     Fetch a single bzip2 file.
55     """
56
57     try:
58         bz = f.nlst()[0]
59         b = open(bz, 'wb')
60     except KeyboardInterrupt:
61         raise
62     except:
63         traceback.print_exc()
64         return None
65     try:
66         print 'Fetching:   %s.' % bz
67         print f.retrbinary('RETR ' + bz, b.write)
68     except KeyboardInterrupt:
69         raise
70     except:
71         traceback.print_exc()
72         b.close()
73         return None
74     else:
75         b.close()
76     return bz
77
78 def _extract(bz):
79     """
80     Extract a single bzip2 file.
81     """
82
83     b = os.path.splitext(bz)[0]
84     print 'Extracting: %s.' % b
85     try:
86         dest = open(b, 'wb')
87     except KeyboardInterrupt:
88         raise
89     except:
90         traceback.print_exc()
91         return False
92     try:
93         src  = bz2.BZ2File(bz)
94     except KeyboardInterrupt:
95         raise
96     except:
97         dest.close()
98         traceback.print_exc()
99         return False
100     try:
101         content = src.read()
102     except KeyboardInterrupt:
103         raise
104     except:
105         dest.close()
106         src.close()
107         traceback.print_exc()
108         return False
109     else:
110         src.close()
111     try:
112         dest.write(content)
113     except KeyboardInterrupt:
114         raise
115     except:
116         dest.close()
117         traceback.print_exc()
118         return False
119     else:
120         dest.close()
121     try:
122         os.remove(bz)
123     except KeyboardInterrupt:
124         raise
125     except:
126         traceback.print_exc()
127         return False
128     return True
129                
130
131 def _process(f, date):
132     """
133     Fetch and extract all the files for a month.
134     """
135
136     day_range = date['range']
137     for day in day_range:
138         date.update({'day': day,})
139         try:
140             print f.cwd(os.path.join(os.path.sep,
141                                      ftp_dir,
142                                      year_spec % date,
143                                      month_spec % date,
144                                      day_spec % date,
145                                      "").replace(os.path.sep, '/'))
146         except KeyboardInterrupt:
147             raise
148         except ftplib.error_perm, e:
149             traceback.print_exc()
150             continue
151         bz = _fetch(f)
152         if not bz: continue
153         if not _extract(bz): continue
154     return True
155
156 def ascat(start_year, start_month, start_day,
157           end_year,   end_month,   end_day):
158     """
159     Fetch and extract a range of files.
160
161     ascat(start_year, start_month, start_day,
162           end_year,   end_month,   end_day   ) -> None
163
164     start_year  is inclusive,
165     start_month is 1-12 inclusive,
166     start_day   is 1-31 inclusive,
167     end_year    is exclusive,
168     end_month   is 2-13 exclusive,
169     end_day     is 2-32 exclusive.
170     """
171
172     f = ftplib.FTP(ftp_server)
173     print f.login(ftp_user, ftp_pass)
174     year_range = range(start_year, end_year)
175     for year in year_range:
176         if year == year_range[0]:
177             _start_month = start_month
178         else:
179             _start_month = 1
180         if year == year_range[-1]:
181             _end_month = end_month
182         else:
183             _end_month = 13
184         month_range = range(_start_month, _end_month)
185         for month in month_range:
186             if year == year_range[0] and month == month_range[0]:
187                 _start_day = start_day
188             else:
189                 _start_day = 1
190             if year == year_range[-1] and month == month_range[-1]:
191                 _end_day = end_day
192             else:
193                 _end_day = calendar.monthrange(year, month)[1] + 1
194             day_range = range(_start_day, _end_day)
195             date = {'year': year,
196                     'month': month,
197                     'range': day_range,
198                    }
199             try:
200                 os.chdir(work_dir)
201                 sub_dir = os.path.join(base_subdir,
202                                        year_spec % date,
203                                        month_spec % date)
204                 os.makedirs(sub_dir)
205                 os.chdir(sub_dir)
206             except OSError, e:
207                 if not str(e).startswith("[Errno 17] File exists"):
208                     traceback.print_exc()
209                     continue
210             if not _process(f, date): continue
211     print f.quit()
212
213 if __name__ == '__main__':
214     try:
215         if len(sys.argv) != 7: raise
216         start_year  = int(sys.argv[1])
217         start_month = int(sys.argv[2])
218         start_day   = int(sys.argv[3])
219         end_year    = int(sys.argv[4]) + 1
220         end_month   = int(sys.argv[5]) + 1
221         end_day     = int(sys.argv[6]) + 1
222     except KeyboardInterrupt:
223         raise
224     except:
225         print __doc__
226         sys.exit()
227     ascat(start_year, start_month, start_day,
228           end_year,   end_month,   end_day)
Note: See TracBrowser for help on using the browser.