@@ -288,7 +288,205 class JRODataReader(JRODataIO): | |||
|
288 | 288 | raise ValueError, "This method has not been implemented" |
|
289 | 289 | |
|
290 | 290 | # def setup(self, dataOutObj=None, path=None, startDateTime=None, endDateTime=None, set=0, expLabel = "", ext = None, online = 0): |
|
291 | def setup(self, dataOutObj=None, path=None, startDateTime=None, endDateTime=None, set=0, expLabel = "", ext = None, online = 0): | |
|
291 | ||
|
292 | def __searchFilesOnLine(self, path, expLabel = "", ext = None, startDate=None, endDate=None, startTime=None, endTime=None): | |
|
293 | """ | |
|
294 | Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y | |
|
295 | devuelve el archivo encontrado ademas de otros datos. | |
|
296 | ||
|
297 | Input: | |
|
298 | path : carpeta donde estan contenidos los files que contiene data | |
|
299 | ||
|
300 | startDate : Fecha inicial. Rechaza todos los directorios donde | |
|
301 | file end time < startDate (obejto datetime.date) | |
|
302 | ||
|
303 | endDate : Fecha final. Rechaza todos los directorios donde | |
|
304 | file start time > endDate (obejto datetime.date) | |
|
305 | ||
|
306 | startTime : Tiempo inicial. Rechaza todos los archivos donde | |
|
307 | file end time < startTime (obejto datetime.time) | |
|
308 | ||
|
309 | endTime : Tiempo final. Rechaza todos los archivos donde | |
|
310 | file start time > endTime (obejto datetime.time) | |
|
311 | ||
|
312 | ext : extension de los files | |
|
313 | ||
|
314 | Return: | |
|
315 | directory : eL directorio donde esta el file encontrado | |
|
316 | filename : el ultimo file de una determinada carpeta | |
|
317 | year : el anho | |
|
318 | doy : el numero de dia del anho | |
|
319 | set : el set del archivo | |
|
320 | ||
|
321 | ||
|
322 | """ | |
|
323 | dirList = [] | |
|
324 | pathList = [] | |
|
325 | directory = None | |
|
326 | ||
|
327 | #Filtra solo los directorios | |
|
328 | for thisPath in os.listdir(path): | |
|
329 | if os.path.isdir(os.path.join(path, thisPath)): | |
|
330 | dirList.append(thisPath) | |
|
331 | ||
|
332 | if not(dirList): | |
|
333 | return None, None, None, None, None | |
|
334 | ||
|
335 | dirList = sorted( dirList, key=str.lower ) | |
|
336 | ||
|
337 | if startDate: | |
|
338 | startDateTime = datetime.datetime.combine(startDate, startTime) | |
|
339 | thisDateTime = startDateTime | |
|
340 | if endDate == None: endDateTime = startDateTime | |
|
341 | else: endDateTime = datetime.datetime.combine(endDate, endTime) | |
|
342 | ||
|
343 | while(thisDateTime <= endDateTime): | |
|
344 | year = thisDateTime.timetuple().tm_year | |
|
345 | doy = thisDateTime.timetuple().tm_yday | |
|
346 | ||
|
347 | match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) | |
|
348 | if len(match) == 0: | |
|
349 | thisDateTime += datetime.timedelta(1) | |
|
350 | continue | |
|
351 | ||
|
352 | pathList.append(os.path.join(path,match[0], expLabel)) | |
|
353 | thisDateTime += datetime.timedelta(1) | |
|
354 | ||
|
355 | if not(pathList): | |
|
356 | print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime()) | |
|
357 | return None, None, None, None, None | |
|
358 | ||
|
359 | directory = pathList[0] | |
|
360 | ||
|
361 | else: | |
|
362 | directory = dirList[-1] | |
|
363 | directory = os.path.join(path,directory) | |
|
364 | ||
|
365 | filename = getlastFileFromPath(directory, ext) | |
|
366 | ||
|
367 | if not(filename): | |
|
368 | return None, None, None, None, None | |
|
369 | ||
|
370 | if not(self.__verifyFile(os.path.join(directory, filename))): | |
|
371 | return None, None, None, None, None | |
|
372 | ||
|
373 | year = int( filename[1:5] ) | |
|
374 | doy = int( filename[5:8] ) | |
|
375 | set = int( filename[8:11] ) | |
|
376 | ||
|
377 | return directory, filename, year, doy, set | |
|
378 | ||
|
379 | ||
|
380 | def __searchFilesOffLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0), endTime=datetime.time(23,59,59),set=None, expLabel = "", ext = ".r"): | |
|
381 | """ | |
|
382 | Realiza una busqueda de los archivos que coincidan con los parametros | |
|
383 | especificados y se encuentren ubicados en el path indicado. Para realizar una busqueda | |
|
384 | correcta la estructura de directorios debe ser la siguiente: | |
|
385 | ||
|
386 | ...path/D[yyyy][ddd]/expLabel/D[yyyy][ddd][sss].ext | |
|
387 | ||
|
388 | [yyyy]: anio | |
|
389 | [ddd] : dia del anio | |
|
390 | [sss] : set del archivo | |
|
391 | ||
|
392 | Inputs: | |
|
393 | path : Directorio de datos donde se realizara la busqueda. Todos los | |
|
394 | ficheros que concidan con el criterio de busqueda seran | |
|
395 | almacenados en una lista y luego retornados. | |
|
396 | startDate : Fecha inicial. Rechaza todos los directorios donde | |
|
397 | file end time < startDate (obejto datetime.date) | |
|
398 | ||
|
399 | endDate : Fecha final. Rechaza todos los directorios donde | |
|
400 | file start time > endDate (obejto datetime.date) | |
|
401 | ||
|
402 | startTime : Tiempo inicial. Rechaza todos los archivos donde | |
|
403 | file end time < startTime (obejto datetime.time) | |
|
404 | ||
|
405 | endTime : Tiempo final. Rechaza todos los archivos donde | |
|
406 | file start time > endTime (obejto datetime.time) | |
|
407 | ||
|
408 | set : Set del primer archivo a leer. Por defecto None | |
|
409 | ||
|
410 | expLabel : Nombre del subdirectorio de datos. Por defecto "" | |
|
411 | ||
|
412 | ext : Extension de los archivos a leer. Por defecto .r | |
|
413 | ||
|
414 | Return: | |
|
415 | ||
|
416 | (pathList, filenameList) | |
|
417 | ||
|
418 | pathList : Lista de directorios donde se encontraron archivos dentro | |
|
419 | de los parametros especificados | |
|
420 | filenameList : Lista de archivos (ruta completa) que coincidieron con los | |
|
421 | parametros especificados. | |
|
422 | ||
|
423 | Variables afectadas: | |
|
424 | ||
|
425 | self.filenameList: Lista de archivos (ruta completa) que la clase utiliza | |
|
426 | como fuente para leer los bloque de datos, si se termina | |
|
427 | de leer todos los bloques de datos de un determinado | |
|
428 | archivo se pasa al siguiente archivo de la lista. | |
|
429 | ||
|
430 | Excepciones: | |
|
431 | ||
|
432 | """ | |
|
433 | ||
|
434 | dirList = [] | |
|
435 | for thisPath in os.listdir(path): | |
|
436 | if os.path.isdir(os.path.join(path,thisPath)): | |
|
437 | dirList.append(thisPath) | |
|
438 | ||
|
439 | if not(dirList): | |
|
440 | return None, None | |
|
441 | ||
|
442 | pathList = [] | |
|
443 | dateList = [] | |
|
444 | ||
|
445 | thisDate = startDate | |
|
446 | ||
|
447 | while(thisDate <= endDate): | |
|
448 | year = thisDate.timetuple().tm_year | |
|
449 | doy = thisDate.timetuple().tm_yday | |
|
450 | ||
|
451 | match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) | |
|
452 | if len(match) == 0: | |
|
453 | thisDate += datetime.timedelta(1) | |
|
454 | continue | |
|
455 | ||
|
456 | pathList.append(os.path.join(path,match[0],expLabel)) | |
|
457 | dateList.append(thisDate) | |
|
458 | thisDate += datetime.timedelta(1) | |
|
459 | ||
|
460 | filenameList = [] | |
|
461 | for index in range(len(pathList)): | |
|
462 | ||
|
463 | thisPath = pathList[index] | |
|
464 | fileList = glob.glob1(thisPath, "*%s" %ext) | |
|
465 | fileList.sort() | |
|
466 | ||
|
467 | #Busqueda de datos en el rango de horas indicados | |
|
468 | thisDate = dateList[index] | |
|
469 | startDT = datetime.datetime.combine(thisDate, startTime) | |
|
470 | endDT = datetime.datetime.combine(thisDate, endTime) | |
|
471 | ||
|
472 | startUtSeconds = time.mktime(startDT.timetuple()) | |
|
473 | endUtSeconds = time.mktime(endDT.timetuple()) | |
|
474 | ||
|
475 | for file in fileList: | |
|
476 | ||
|
477 | filename = os.path.join(thisPath,file) | |
|
478 | ||
|
479 | if isThisFileinRange(filename, startUtSeconds, endUtSeconds): | |
|
480 | filenameList.append(filename) | |
|
481 | ||
|
482 | if not(filenameList): | |
|
483 | return None, None | |
|
484 | ||
|
485 | self.filenameList = filenameList | |
|
486 | ||
|
487 | return pathList, filenameList | |
|
488 | ||
|
489 | def setup(self, dataOutObj=None, path=None, startDate=None, endDate=None, startTime=datetime.time(0,0,0), endTime=datetime.time(23,59,59), set=0, expLabel = "", ext = None, online = 0): | |
|
292 | 490 | """ |
|
293 | 491 | setup configura los parametros de lectura de la clase DataReader. |
|
294 | 492 | |
@@ -302,11 +500,17 class JRODataReader(JRODataIO): | |||
|
302 | 500 | |
|
303 | 501 | path/D[yyyy][ddd]/expLabel/P[yyyy][ddd][sss][ext] |
|
304 | 502 | |
|
305 |
startDate |
|
|
306 |
|
|
|
503 | startDate : Fecha inicial. Rechaza todos los directorios donde | |
|
504 | file end time < startDate (obejto datetime.date) | |
|
505 | ||
|
506 | endDate : Fecha final. Rechaza todos los directorios donde | |
|
507 | file start time > endDate (obejto datetime.date) | |
|
307 | 508 | |
|
308 |
|
|
|
309 |
|
|
|
509 | startTime : Tiempo inicial. Rechaza todos los archivos donde | |
|
510 | file end time < startTime (obejto datetime.time) | |
|
511 | ||
|
512 | endTime : Tiempo final. Rechaza todos los archivos donde | |
|
513 | file start time > endTime (obejto datetime.time) | |
|
310 | 514 | |
|
311 | 515 | set : Set del primer archivo a leer. Por defecto None |
|
312 | 516 | |
@@ -321,8 +525,6 class JRODataReader(JRODataIO): | |||
|
321 | 525 | 1 : Si encuentra files que cumplan con las condiciones dadas |
|
322 | 526 | |
|
323 | 527 | Affected: |
|
324 | self.startUTCSeconds | |
|
325 | self.endUTCSeconds | |
|
326 | 528 | self.startYear |
|
327 | 529 | self.endYear |
|
328 | 530 | self.startDoy |
@@ -343,14 +545,14 class JRODataReader(JRODataIO): | |||
|
343 | 545 | self.dataOutObj = dataOutObj |
|
344 | 546 | |
|
345 | 547 | if online: |
|
346 | print "Searching files ..." | |
|
347 |
doypath, file, year, doy, set = self.__searchFilesOnLine(path, |
|
|
548 | print "Searching files in online mode..." | |
|
549 | doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=exp) | |
|
348 | 550 | |
|
349 | 551 | if not(doypath): |
|
350 | 552 | for nTries in range( self.nTries ): |
|
351 | 553 | print '\tWaiting %0.2f sec for valid file in %s: try %02d ...' % (self.delay, path, nTries+1) |
|
352 | 554 | time.sleep( self.delay ) |
|
353 |
doypath, file, year, doy, set = self.__searchFilesOnLine(path, |
|
|
555 | doypath, file, year, doy, set = self.__searchFilesOnLine(path=path, expLabel=expLabel, ext=exp) | |
|
354 | 556 | if doypath: |
|
355 | 557 | break |
|
356 | 558 | |
@@ -364,7 +566,8 class JRODataReader(JRODataIO): | |||
|
364 | 566 | self.path = path |
|
365 | 567 | |
|
366 | 568 | else: # offline |
|
367 | pathList, filenameList = self.__searchFilesOffLine(path, startDateTime, endDateTime, set, expLabel, ext) | |
|
569 | print "Searching files in offline mode..." | |
|
570 | pathList, filenameList = self.__searchFilesOffLine(path, startDate, endDate, startTime, endTime, set, expLabel, ext) | |
|
368 | 571 | if not(pathList): |
|
369 | 572 | print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime()) |
|
370 | 573 | return None |
@@ -379,23 +582,14 class JRODataReader(JRODataIO): | |||
|
379 | 582 | ext = ext.lower() |
|
380 | 583 | |
|
381 | 584 | if not( self.setNextFile() ): |
|
382 |
if (startDate |
|
|
383 |
print "No files in range: %s - %s" %(startDate |
|
|
384 |
elif startDate |
|
|
385 |
print "No files in : %s" % startDate |
|
|
585 | if (startDate != None) and (endDate != None): | |
|
586 | print "No files in range: %s - %s" %(startDate.ctime(), endDate.ctime()) | |
|
587 | elif startDate != None: | |
|
588 | print "No files in : %s" % startDate.ctime() | |
|
386 | 589 | else: |
|
387 | 590 | print "No files" |
|
388 | 591 | return None |
|
389 | 592 | |
|
390 | if startDateTime != None: | |
|
391 | self.startUTCSeconds = time.mktime(startDateTime.timetuple()) | |
|
392 | self.startYear = startDateTime.timetuple().tm_year | |
|
393 | self.startDoy = startDateTime.timetuple().tm_yday | |
|
394 | ||
|
395 | if endDateTime != None: | |
|
396 | self.endUTCSeconds = time.mktime(endDateTime.timetuple()) | |
|
397 | self.endYear = endDateTime.timetuple().tm_year | |
|
398 | self.endDoy = endDateTime.timetuple().tm_yday | |
|
399 | 593 | #call fillHeaderValues() - to Data Object |
|
400 | 594 | |
|
401 | 595 | self.updateDataHeader() |
@@ -733,170 +927,6 class JRODataReader(JRODataIO): | |||
|
733 | 927 | self.nReadBlocks = 0 |
|
734 | 928 | return 1 |
|
735 | 929 | |
|
736 | def __searchFilesOnLine(self, path, startDateTime=None, endDateTime=None, expLabel = "", ext = None): | |
|
737 | """ | |
|
738 | Busca el ultimo archivo de la ultima carpeta (determinada o no por startDateTime) y | |
|
739 | devuelve el archivo encontrado ademas de otros datos. | |
|
740 | ||
|
741 | Input: | |
|
742 | path : carpeta donde estan contenidos los files que contiene data | |
|
743 | startDateTime : punto especifico en el tiempo del cual se requiere la data | |
|
744 | ext : extension de los files | |
|
745 | ||
|
746 | Return: | |
|
747 | year : el anho | |
|
748 | doy : el numero de dia del anho | |
|
749 | set : el set del archivo | |
|
750 | filename : el ultimo file de una determinada carpeta | |
|
751 | directory : eL directorio donde esta el file encontrado | |
|
752 | """ | |
|
753 | dirList = [] | |
|
754 | pathList = [] | |
|
755 | directory = None | |
|
756 | ||
|
757 | for thisPath in os.listdir(path): | |
|
758 | if os.path.isdir(os.path.join(path,thisPath)): | |
|
759 | dirList.append(thisPath) | |
|
760 | ||
|
761 | if not(dirList): | |
|
762 | return None, None, None, None, None | |
|
763 | ||
|
764 | dirList = sorted( dirList, key=str.lower ) | |
|
765 | ||
|
766 | if startDateTime: | |
|
767 | thisDateTime = startDateTime | |
|
768 | if endDateTime == None: endDateTime = startDateTime | |
|
769 | ||
|
770 | while(thisDateTime <= endDateTime): | |
|
771 | year = thisDateTime.timetuple().tm_year | |
|
772 | doy = thisDateTime.timetuple().tm_yday | |
|
773 | ||
|
774 | match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) | |
|
775 | if len(match) == 0: | |
|
776 | thisDateTime += datetime.timedelta(1) | |
|
777 | continue | |
|
778 | ||
|
779 | pathList.append(os.path.join(path,match[0], expLabel)) | |
|
780 | thisDateTime += datetime.timedelta(1) | |
|
781 | ||
|
782 | if not(pathList): | |
|
783 | print "\tNo files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime()) | |
|
784 | return None, None, None, None, None | |
|
785 | ||
|
786 | directory = pathList[0] | |
|
787 | ||
|
788 | else: | |
|
789 | directory = dirList[-1] | |
|
790 | directory = os.path.join(path,directory) | |
|
791 | ||
|
792 | filename = getlastFileFromPath(directory, ext) | |
|
793 | ||
|
794 | if not(filename): | |
|
795 | return None, None, None, None, None | |
|
796 | ||
|
797 | if not(self.__verifyFile(os.path.join(directory, filename))): | |
|
798 | return None, None, None, None, None | |
|
799 | ||
|
800 | year = int( filename[1:5] ) | |
|
801 | doy = int( filename[5:8] ) | |
|
802 | set = int( filename[8:11] ) | |
|
803 | ||
|
804 | return directory, filename, year, doy, set | |
|
805 | ||
|
806 | ||
|
807 | def __searchFilesOffLine(self, path, startDateTime, endDateTime, set=None, expLabel = "", ext = ".r"): | |
|
808 | """ | |
|
809 | Realiza una busqueda de los archivos que coincidan con los parametros | |
|
810 | especificados y se encuentren ubicados en el path indicado. Para realizar una busqueda | |
|
811 | correcta la estructura de directorios debe ser la siguiente: | |
|
812 | ||
|
813 | ...path/D[yyyy][ddd]/expLabel/D[yyyy][ddd][sss].ext | |
|
814 | ||
|
815 | [yyyy]: anio | |
|
816 | [ddd] : dia del anio | |
|
817 | [sss] : set del archivo | |
|
818 | ||
|
819 | Inputs: | |
|
820 | path : Directorio de datos donde se realizara la busqueda. Todos los | |
|
821 | ficheros que concidan con el criterio de busqueda seran | |
|
822 | almacenados en una lista y luego retornados. | |
|
823 | startDateTime : Fecha inicial. Rechaza todos los archivos donde | |
|
824 | file end time < startDateTime (obejto datetime.datetime) | |
|
825 | ||
|
826 | endDateTime : Fecha final. Rechaza todos los archivos donde | |
|
827 | file start time > endDateTime (obejto datetime.datetime) | |
|
828 | ||
|
829 | set : Set del primer archivo a leer. Por defecto None | |
|
830 | ||
|
831 | expLabel : Nombre del subdirectorio de datos. Por defecto "" | |
|
832 | ||
|
833 | ext : Extension de los archivos a leer. Por defecto .r | |
|
834 | ||
|
835 | Return: | |
|
836 | ||
|
837 | (pathList, filenameList) | |
|
838 | ||
|
839 | pathList : Lista de directorios donde se encontraron archivos dentro | |
|
840 | de los parametros especificados | |
|
841 | filenameList : Lista de archivos (ruta completa) que coincidieron con los | |
|
842 | parametros especificados. | |
|
843 | ||
|
844 | Variables afectadas: | |
|
845 | ||
|
846 | self.filenameList: Lista de archivos (ruta completa) que la clase utiliza | |
|
847 | como fuente para leer los bloque de datos, si se termina | |
|
848 | de leer todos los bloques de datos de un determinado | |
|
849 | archivo se pasa al siguiente archivo de la lista. | |
|
850 | ||
|
851 | Excepciones: | |
|
852 | ||
|
853 | """ | |
|
854 | ||
|
855 | print "Searching files ..." | |
|
856 | ||
|
857 | dirList = [] | |
|
858 | for thisPath in os.listdir(path): | |
|
859 | if os.path.isdir(os.path.join(path,thisPath)): | |
|
860 | dirList.append(thisPath) | |
|
861 | ||
|
862 | if not(dirList): | |
|
863 | return None, None | |
|
864 | ||
|
865 | pathList = [] | |
|
866 | ||
|
867 | thisDateTime = startDateTime | |
|
868 | ||
|
869 | while(thisDateTime <= endDateTime): | |
|
870 | year = thisDateTime.timetuple().tm_year | |
|
871 | doy = thisDateTime.timetuple().tm_yday | |
|
872 | ||
|
873 | match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) | |
|
874 | if len(match) == 0: | |
|
875 | thisDateTime += datetime.timedelta(1) | |
|
876 | continue | |
|
877 | ||
|
878 | pathList.append(os.path.join(path,match[0],expLabel)) | |
|
879 | thisDateTime += datetime.timedelta(1) | |
|
880 | ||
|
881 | startUtSeconds = time.mktime(startDateTime.timetuple()) | |
|
882 | endUtSeconds = time.mktime(endDateTime.timetuple()) | |
|
883 | ||
|
884 | filenameList = [] | |
|
885 | for thisPath in pathList: | |
|
886 | fileList = glob.glob1(thisPath, "*%s" %ext) | |
|
887 | fileList.sort() | |
|
888 | for file in fileList: | |
|
889 | filename = os.path.join(thisPath,file) | |
|
890 | if isThisFileinRange(filename, startUtSeconds, endUtSeconds): | |
|
891 | filenameList.append(filename) | |
|
892 | ||
|
893 | if not(filenameList): | |
|
894 | return None, None | |
|
895 | ||
|
896 | self.filenameList = filenameList | |
|
897 | ||
|
898 | return pathList, filenameList | |
|
899 | ||
|
900 | 930 | def __verifyFile(self, filename, msgFlag=True): |
|
901 | 931 | """ |
|
902 | 932 | Verifica que el filename tenga data valida, para ello leo el FirstHeader del file |
General Comments 0
You need to be logged in to leave comments.
Login now