IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Téléchargements de fichiers [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut Téléchargements de fichiers
    Bonsoir,
    Je me suis mis en tête de créer un script python pour télécharger les gribs sur le site de la NOAA puis de les manipuler via cdo (Climate Data Operator).
    A la main j'obtient bien le résultat voulu mais c'est long et fastidieux.

    J'en suis rendu aux téléchargements des fichiers, j'arrive à générer les url qu'il faut mais je m'y perd complètement entre les méthodes wget, curl, requests & urllib.
    Qu'est ce qui est le plus approprié ?

    Petite précision je ne connaissais quasiment rien au Python il y a moins de 48h et à force de lire les manuels et autres exemples de code, y'a plus rien qui veut rentrer ...
    Je suppose que le code est loin d'être parfait si vous remarquez des aberrations faite le moi savoir je tacherais de corriger le tir.

    Merci pour vos lumières 😉

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
     
    from datetime import datetime, timedelta
    from os import listdir, makedirs, name, path, remove, removedirs
     
     
    ## DateTime UTC
    cDT = datetime.utcnow()
    pDT = cDT - timedelta(days=1)
    # print('Current DATETIME =', cDT,
    #      '\nPrevious DATETIME =', pDT)
     
     
    ## Date
    cDate = cDT.strftime('%Y''%m''%d')
    pDate = pDT.strftime('%Y''%m''%d')
    # print('Current Date =', cDate,
    #      '\nPrevious Date =', pDate)
     
     
    ## Hour
    cHourUTC = cDT.strftime('%H'':''%M')
    # print ('Current Hour =', cHourUTC)
     
     
    ## Parameters Url
    # ["Date of current TZ", "Current TZ", "Date of previous TZ", "Previous TZ", "Obsolete TZ"]
    def paramUrl(cHourUTC):
        if '03:30' <= cHourUTC < '09:30':
            cTZ = '00'
            pTZ = '18'
            oTZ = '12'
            return [cDate, cTZ, pDate, pTZ, oTZ]
        elif '09:30' <= cHourUTC < '15:30':
            cTZ = '06'
            pTZ = '00'
            oTZ = '18'
            return [cDate, cTZ, cDate, pTZ, oTZ]
        elif '15:30' <= cHourUTC < '21:30':
            cTZ = '12'
            pTZ = '06'
            oTZ = '00'
            return [cDate, cTZ, cDate, pTZ, oTZ]
        else:
            cTZ = '18'
            pTZ = '12'
            oTZ = '06'
            return [cDate, cTZ, cDate, pTZ, oTZ]
    #print('Date of current TZ =', paramUrl(cHourUTC)[0],
    #      '\nCurrent TZ =', paramUrl(cHourUTC)[1],
    #      '\nDate of previous TZ =', paramUrl(cHourUTC)[2],
    #      '\nPrevious TZ =', paramUrl(cHourUTC)[3],
    #      '\nObsolete TZ =', paramUrl(cHourUTC)[4])
     
     
    ## Directories
    # Default PATH / directories
    defPath = path.expanduser('~')
     
    dir_oTZ = paramUrl(cHourUTC)[4]
    dir_pTZ = paramUrl(cHourUTC)[3]
    dir_cTZ = paramUrl(cHourUTC)[1]
    dir_grb = 'grb'
     
    path_oTZ = path.join(defPath, 'NoaaDownloader', dir_oTZ)
    path_pTZ = path.join(defPath, 'NoaaDownloader', dir_pTZ)
    path_cTZ = path.join(defPath, 'NoaaDownloader', dir_cTZ)
    path_grb = path.join(defPath, 'NoaaDownloader', dir_grb)
     
    # Remove Obsolete files & directory if exist
    def delFilDir(dirPath):
        if path.isdir(dirPath) == True:
            files = listdir(dirPath)
            for i in range(0, len(files)):
                if name == 'nt':
                    remove(dirPath + '\\' + files[i])
                else:
                    remove(dirPath + '/' + files[i])
            removedirs(dirPath)
     
    delFilDir(path_oTZ)
     
    # Create directories if not exist
    makedirs(path_pTZ, exist_ok=True)
    makedirs(path_cTZ, exist_ok=True)
    makedirs(path_grb, exist_ok=True)
     
    ## Download TM previous TZ & current TZ
    Gfs1TM = ['000', '003', '006', '009', '012', '015', '018', '021', '024',
              '027', '030', '033', '036', '039', '042', '045', '048',
              '051', '054', '057', '060', '063', '066', '069', '072',
              '075', '078', '081', '084', '087', '090', '093', '096',
              '099', '102', '105', '108', '111', '114', '117', '120',
              '123', '126', '129', '132', '135', '138', '141', '144',
              '147', '150', '153', '156', '159', '162', '165', '168',
              '171', '174', '177', '180', '183', '186', '189', '192',
              '195', '198', '201', '204', '207', '210', '213', '216',
              '219', '222', '225', '228', '231', '234', '237', '240',
              '243', '246', '249', '252', '255', '258', '261', '264',
              '267', '270', '273', '276', '279', '282', '285', '288',
              '291', '294', '297', '300', '303', '306', '309', '312',
              '315', '318', '321', '324', '327', '330', '333', '336',
              '339', '342', '345', '348', '351', '354', '357', '360',
              '363', '366', '369', '372', '375', '378', '381', '384']
     
    for pTM in Gfs1TM:
        # Download 129 TM of previous TZ
        pUrlNoaa = 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl?' + \
                   'file=gfs.t' + paramUrl(cHourUTC)[3] + 'z.pgrb2.1p00.f' + pTM + \
                   '&lev_10_m_above_ground=on' + \
                   '&var_UGRD=on&var_VGRD=on' + \
                   '&leftlon=0&rightlon=360' + \
                   '&toplat=90&bottomlat=-90' + \
                   '&dir=%2Fgfs.' + paramUrl(cHourUTC)[2] + '%2F' + paramUrl(cHourUTC)[3]
        #print('TM' + pTM + ' pTZ =>' + pUrlNoaa)
     
    for cTM in Gfs1TM:
        # Download 129 TM of current TZ
        # If TM not available, wait 60s
        cUrlNoaa = 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl?' + \
                   'file=gfs.t' + paramUrl(cHourUTC)[1] + 'z.pgrb2.1p00.f' + cTM + \
                   '&lev_10_m_above_ground=on' + \
                   '&var_UGRD=on&var_VGRD=on' + \
                   '&leftlon=0&rightlon=360' + \
                   '&toplat=90&bottomlat=-90' + \
                   '&dir=%2Fgfs.' + paramUrl(cHourUTC)[0] + '%2F' + paramUrl(cHourUTC)[1]
     
        if cTM == '006':
            #print('TM' + cTM + ' cTZ Create 14 TM003 =>' + cUrlNoaa)
            continue
        if cTM == '024':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '048':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '072':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '096':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '120':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '144':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '168':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '192':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '216':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '240':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '264':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '288':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '312':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '336':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '360':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '384':
            #print('TM' + cTM + ' cTZ Create full grib =>' + cUrlNoaa)
            continue
        #print('TM' + cTM + ' cTZ =>' + cUrlNoaa)

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 804
    Points : 7 080
    Points
    7 080
    Par défaut
    Bonsoir,

    Qu'est ce qui est le plus approprié ?
    Les plus utilisés sont requests et urllib, mais beaucoup y compris moi ont une préférence pour requests.

    Je suppose que le code est loin d'être parfait si vous remarquez des aberrations faite le moi savoir je tacherais de corriger le tir.
    Pas d'aberration spécialement, seulement des raccourcis que tu connaîtras avec l'expérience dans ce langage, comme par exemple l'utilisation des tuples ou des listes pour vérifier si une valeur est présente dans le conteneur.
    Ça permet de rendre plus court le code et en utilisant les bons objets python, une manière plus élégante et performante d'arriver au même objectif.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    ok merci je vais donc me concentrer sur requests

  4. #4
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Essayez de générer vos listes avec range, il est possible de préciser un pas, dire de tant à tant tous les tants
    Et après pour construire vos URL vous pouvez utiliser format ou les fstring
    Avec ça vous pouvez mettre ce qu'on appelle du padding facilement, en gros dire "je veux ce chiffre sous forme de chaine de caractères de 5 de longs minimum en rajoutant tel caractères devant ou derrière pour compléter
    Un exemple https://stackoverflow.com/a/339013

    Aussi je vous conseil de regarder pathlib qui est plus simple à utiliser (selon moi)
    Vos if pourrais être factorisé facilement en 2: 1 pour le 6 et un pour les multiples de 24, on peut également faire une seule condition, une fois qu'on a les deux il suffit de mettre un or et de coller les deux.

    PS os.path.sep vous permettrait de ne pas à avoir à vérifier l'os par vous même, mieux serais d'utiliser path.join, et le must serait d'utiliser pathlib

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    Essayez de générer vos listes avec range, il est possible de préciser un pas, dire de tant à tant tous les tants
    je suppose que vous parler de Gfs1TM, j'ai regardé pour le faire avec range car effectivement ça supprime de nombreuses lignes dans le code pour un résultat identique.
    Question :
    J'en suis pas au point d'améliorer les "performances" du script mais pour ma gouverne, la méthode range est plus performante que ce que j'ai fait je suppose ou c'est une méthode à préférer ?

    Et après pour construire vos URL vous pouvez utiliser format ou les fstring
    Avec ça vous pouvez mettre ce qu'on appelle du padding facilement, en gros dire "je veux ce chiffre sous forme de chaine de caractères de 5 de longs minimum en rajoutant tel caractères devant ou derrière pour compléter
    Un exemple https://stackoverflow.com/a/339013
    Merci pour le lien, j'vais étudier ça car si j'arrive à mettre en place la méthode range, je vais avoir besoin de n.zfill(3) pour que ça fonctionne correctement.

    Aussi je vous conseil de regarder pathlib qui est plus simple à utiliser (selon moi)
    Vos if pourrais être factorisé facilement en 2: 1 pour le 6 et un pour les multiples de 24, on peut également faire une seule condition, une fois qu'on a les deux il suffit de mettre un or et de coller les deux.
    PS os.path.sep vous permettrait de ne pas à avoir à vérifier l'os par vous même, mieux serais d'utiliser path.join, et le must serait d'utiliser pathlib
    Là clairement vous m'avez perdu 😖 ...
    En revanche j'viens de remarquer une chose, je ne sais pour quelle raison j'étais persuadé que path.join se limitait aux répertoires ... et j'viens de voir qu'enfaite non je peux l'appliquer aux fichiers également ce qui va me dispenser des (j'en ai mis d'autres depuis) if name = 'nt': ...


    Merci pour ces conseils 😉, je vais tacher de mettre ceux-ci en oeuvre et posterais le script corrigé ici.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Bonsoir,
    J'ai appliqué vos conseils.

    • range()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    [...]
    Gfs1TM = ['000', '003', '006', '009', '012', '015', '018', '021', '024',
              '027', '030', '033', '036', '039', '042', '045', '048',
              '051', '054', '057', '060', '063', '066', '069', '072',
              '075', '078', '081', '084', '087', '090', '093', '096',
              '099', '102', '105', '108', '111', '114', '117', '120',
              '123', '126', '129', '132', '135', '138', '141', '144',
              '147', '150', '153', '156', '159', '162', '165', '168',
              '171', '174', '177', '180', '183', '186', '189', '192',
              '195', '198', '201', '204', '207', '210', '213', '216',
              '219', '222', '225', '228', '231', '234', '237', '240',
              '243', '246', '249', '252', '255', '258', '261', '264',
              '267', '270', '273', '276', '279', '282', '285', '288',
              '291', '294', '297', '300', '303', '306', '309', '312',
              '315', '318', '321', '324', '327', '330', '333', '336',
              '339', '342', '345', '348', '351', '354', '357', '360',
              '363', '366', '369', '372', '375', '378', '381', '384']
     
    for pTM in Gfs1TM:
    [...]
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
    for pTM in range(0, 387, 3):
    [...]
    • format ou fstring
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    URL = [...] + str(pTM).zfill(3) + [...]
    • path.join
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [...]
    def delFilDir(dirPath):
        if path.isdir(dirPath) == True:
            files = listdir(dirPath)
            for i in range(0, len(files)):
                if name == 'nt':
                    remove(dirPath + '\\' + files[i])
                else:
                    remove(dirPath + '/' + files[i])
            removedirs(dirPath)
    [...]
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [...]
    def delFilDir(dirPath):
        if path.isdir(dirPath) == True:
            files = listdir(dirPath)
            for i in range(0, len(files)):
                remove(path.join(dirPath, files[i]))
            removedirs(dirPath)
    [...]
    • Requests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    [...]
    s = Session()
    for pTM in range(0, 387, 3):
        # Download 129 TM of previous TZ
        pUrlNoaa = 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl?' + \
                   'file=gfs.t' + paramUrl(cHourUTC)[3] + 'z.pgrb2.1p00.f' + str(pTM).zfill(3) + \
                   '&lev_10_m_above_ground=on' + \
                   '&var_UGRD=on&var_VGRD=on' + \
                   '&leftlon=0&rightlon=360' + \
                   '&toplat=90&bottomlat=-90' + \
                   '&dir=%2Fgfs.' + paramUrl(cHourUTC)[2] + '%2F' + paramUrl(cHourUTC)[3]
     
        r = s.get(pUrlNoaa)
        open(path.join(path_pTZ, 'GFS1_' + paramUrl(cHourUTC)[2] + '_' + paramUrl(cHourUTC)[3] + '_' + str(pTM).zfill(3) + '.grb2'), 'wb').write(r.content)
        print('GFS1_' + paramUrl(cHourUTC)[2] + '_' + paramUrl(cHourUTC)[3] + '_' + str(pTM).zfill(3) + '.grb2')
    [...]
    Je suppose qu'ici, je dois utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    payload = {'key1': 'value1', 'key2': 'value2'}
    r = s.get('URL', params=payload)
    ?

    J'ai utilisé requests.Session() car j'ai lu ceci :
    "Lorsqu'on utilise des requêtes dans son mode simple (par exemple avec la fonction GET) la connexion est fermée au retour. Pour éviter cela, une application doit utiliser un objet Session qui permet de réutiliser une connexion déjà ouverte."
    et j'ai donc chronométré requests avec et sans Session()
    Sans : env 4m20s
    Avec: env 2m25s
    ce qui est assez conséquent je trouve mais est il possible de faire mieux ?

    Les conseils sont ils bien appliqués ?

    Merci

    Le script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    from datetime import datetime, timedelta
    from os import listdir, makedirs, path, remove, removedirs
    from requests import Session
     
     
    ## DateTime UTC
    cDT = datetime.utcnow()
    pDT = cDT - timedelta(days=1)
    #print('Current DATETIME =', cDT,
    #      '\nPrevious DATETIME =', pDT)
     
     
    ## Date
    cDate = cDT.strftime('%Y''%m''%d')
    pDate = pDT.strftime('%Y''%m''%d')
    #print('Current Date =', cDate,
    #      '\nPrevious Date =', pDate)
     
     
    ## Hour
    cHourUTC = cDT.strftime('%H'':''%M')
    #print('Current Hour =', cHourUTC)
     
     
    ## Parameters Url
    # ["Date of current TZ", "Current TZ", "Date of previous TZ", "Previous TZ", "Obsolete TZ"]
    def paramUrl(cHourUTC):
        if '03:30' <= cHourUTC < '09:30':
            cTZ = '00'
            pTZ = '18'
            oTZ = '12'
            return [cDate, cTZ, pDate, pTZ, oTZ]
        elif '09:30' <= cHourUTC < '15:30':
            cTZ = '06'
            pTZ = '00'
            oTZ = '18'
            return [cDate, cTZ, cDate, pTZ, oTZ]
        elif '15:30' <= cHourUTC < '21:30':
            cTZ = '12'
            pTZ = '06'
            oTZ = '00'
            return [cDate, cTZ, cDate, pTZ, oTZ]
        else:
            cTZ = '18'
            pTZ = '12'
            oTZ = '06'
            return [cDate, cTZ, cDate, pTZ, oTZ]
    #print('Date of current TZ =', paramUrl(cHourUTC)[0],
    #      '\nCurrent TZ =', paramUrl(cHourUTC)[1],
    #      '\nDate of previous TZ =', paramUrl(cHourUTC)[2],
    #      '\nPrevious TZ =', paramUrl(cHourUTC)[3],
    #      '\nObsolete TZ =', paramUrl(cHourUTC)[4])
     
     
    ## Directories
    # Default PATH / directories
    defPath = path.expanduser('~')
     
    dir_oTZ = paramUrl(cHourUTC)[4]
    dir_pTZ = paramUrl(cHourUTC)[3]
    dir_cTZ = paramUrl(cHourUTC)[1]
    dir_grb = 'grb'
     
    path_oTZ = path.join(defPath, 'NoaaDownloader', dir_oTZ)
    path_pTZ = path.join(defPath, 'NoaaDownloader', dir_pTZ)
    path_cTZ = path.join(defPath, 'NoaaDownloader', dir_cTZ)
    path_grb = path.join(defPath, 'NoaaDownloader', dir_grb)
     
    # Remove Obsolete files & directory if exist
    def delFilDir(dirPath):
        if path.isdir(dirPath) == True:
            files = listdir(dirPath)
            for i in range(0, len(files)):
                remove(path.join(dirPath, files[i]))
            removedirs(dirPath)
     
    delFilDir(path_oTZ)
     
    # Create directories if not exist
    makedirs(path_pTZ, exist_ok=True)
    makedirs(path_cTZ, exist_ok=True)
    makedirs(path_grb, exist_ok=True)
     
    ## Download TM previous TZ & current TZ
    s = Session()
    for pTM in range(0, 387, 3):
        # Download 129 TM of previous TZ
        pUrlNoaa = 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl?' + \
                   'file=gfs.t' + paramUrl(cHourUTC)[3] + 'z.pgrb2.1p00.f' + str(pTM).zfill(3) + \
                   '&lev_10_m_above_ground=on' + \
                   '&var_UGRD=on&var_VGRD=on' + \
                   '&leftlon=0&rightlon=360' + \
                   '&toplat=90&bottomlat=-90' + \
                   '&dir=%2Fgfs.' + paramUrl(cHourUTC)[2] + '%2F' + paramUrl(cHourUTC)[3]
     
        r = s.get(pUrlNoaa)
        open(path.join(path_pTZ, 'GFS1_' + paramUrl(cHourUTC)[2] + '_' + paramUrl(cHourUTC)[3] + '_' + str(pTM).zfill(3) + '.grb2'), 'wb').write(r.content)
        print('GFS1_' + paramUrl(cHourUTC)[2] + '_' + paramUrl(cHourUTC)[3] + '_' + str(pTM).zfill(3) + '.grb2')
     
    """
    for cTM in range(0, 387, 3):
        # Download 129 TM of current TZ
        # If TM not available, wait 60s
        cUrlNoaa = 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl?' + \
                   'file=gfs.t' + paramUrl(cHourUTC)[1] + 'z.pgrb2.1p00.f' + str(cTM).zfill(3) + \
                   '&lev_10_m_above_ground=on' + \
                   '&var_UGRD=on&var_VGRD=on' + \
                   '&leftlon=0&rightlon=360' + \
                   '&toplat=90&bottomlat=-90' + \
                   '&dir=%2Fgfs.' + paramUrl(cHourUTC)[0] + '%2F' + paramUrl(cHourUTC)[1]
     
        if cTM == '006':
            #print('TM' + cTM + ' cTZ Create 14 TM003 =>' + cUrlNoaa)
            continue
        if cTM == '024':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '048':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '072':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '096':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '120':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '144':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '168':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '192':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '216':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '240':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '264':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '288':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '312':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '336':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '360':
            #print('TM' + cTM + ' cTZ Create partial grib =>' + cUrlNoaa)
            continue
        if cTM == '384':
            #print('TM' + cTM + ' cTZ Create full grib =>' + cUrlNoaa)
            continue
        #print('TM' + cTM + ' cTZ =>' + cUrlNoaa)
    """

  7. #7
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Vous n'utilisez pas format ou les fstring ici, ce qui est dommage, URL pourrais devenirURL = f"truc {pTM:03} machin"Si vous utilisez requests vous pouvez faire encore mieux pour construire votre URL comme vous l'avez pensé https://requests.readthedocs.io/en/m...meters-in-urls

    Pour remplacer votre fonction delFilDir vous pouvez vous tourner vers shutils (je pense que le nom viens tout simplement de SHell UTILS) https://docs.python.org/3/library/sh...#shutil.rmtree

    Vous devriez réécrire votre open
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open(...) as f:
        f.write(...)
    Essayé de voir pour factoriser vos if

    Vous avez :
    Si cTM égal 6
    Si cTM égal 24
    Si cTM égal 48
    [...]

    Alors que vous pourriez écrire
    Si cTM égal 6 faire
    Si cTM est un multiple de 24

    Puis : si cTM est égal à 6 ou un multiple de 24

    Principe mathématique: n est divisible par k si le reste de la division euclidienne de n par k est égal à 0
    En python (et dans la quasi totalité des langages) une division euclidienne de n par k => n%k

    PS: On peut également dire que tout nombre ( si on va pas taper dans les hypercomplèxe ou les hyperréels) s'écrit de la forme n = p x k + r, avec r= n%k

    PS2: vous devriez jeter un coup d'oeil à pathlib https://docs.python.org/3/library/pa...-the-os-module , de même regardez la PEP8 qui décrit les bonnes pratiques de nommage, structure, ect http://sametmax.com/le-pep8-en-resume/ http://sametmax.com/le-pep8-et-au-dela-par-la-pratique/

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Merci , je prends en compte vos remarques / conseils et tente de les appliquer correctement 😉

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Bonsoir,

    Vous n'utilisez pas format ou les fstring ici, ce qui est dommage, URL pourrais devenirURL = f"truc {pTM:03} machin"
    Lors de mon essai je n'avais pas mis le f mais seulement '{pTM:03}' donc forcement ça ne fonctionnait pas ... et c'est pour cela que j'avais opté pour str(pTM).zfill(3).


    Pour remplacer votre fonction delFilDir vous pouvez vous tourner vers shutils (je pense que le nom viens tout simplement de SHell UTILS) https://docs.python.org/3/library/sh...#shutil.rmtree
    Effectivement rmtree(path_oTZ, ignore_errors=True, onerror=None) me dispense de la fonction, merci.


    Si vous utilisez requests vous pouvez faire encore mieux pour construire votre URL comme vous l'avez pensé https://requests.readthedocs.io/en/m...meters-in-urls
    Ça j'ai galéré à le mettre en place, je n'avais pas bien lu l'aide du dictionnaire et une fois que j'y suis arrivé, les fichiers étaient non valide ...
    %2F se transforme en %252F dans l'url complète et elle est donc non valide, j'ai remplacé %2F par / et ça fonctionne correctement ...
    Je comprends pas pourquoi cette transformation.

    Vous devriez réécrire votre open
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open(...) as f:
        f.write(...)
    C'était comme ça lors du premier "jet" puis je l'ai concaténé, je l'ai donc remis comme suggéré.


    Essayé de voir pour factoriser vos if

    Vous avez :
    Si cTM égal 6
    Si cTM égal 24
    Si cTM égal 48
    [...]

    Alors que vous pourriez écrire
    Si cTM égal 6 faire
    Si cTM est un multiple de 24

    Puis : si cTM est égal à 6 ou un multiple de 24

    Principe mathématique: n est divisible par k si le reste de la division euclidienne de n par k est égal à 0
    En python (et dans la quasi totalité des langages) une division euclidienne de n par k => n%k

    PS: On peut également dire que tout nombre ( si on va pas taper dans les hypercomplèxe ou les hyperréels) s'écrit de la forme n = p x k + r, avec r= n%k

    PS2: vous devriez jeter un coup d'oeil à pathlib https://docs.python.org/3/library/pa...-the-os-module , de même regardez la PEP8 qui décrit les bonnes pratiques de nommage, structure, ect http://sametmax.com/le-pep8-en-resume/ http://sametmax.com/le-pep8-et-au-dela-par-la-pratique/
    Ça ça veut toujours pas rentrer ...
    pathlib j'y comprends pas grand chose et la factorisation bien que je crois comprendre, je vois pas comment réaliser ça, je vais creuser le sujet ce w-d
    Pour les bonnes pratiques j'ai revu ma copie, PyCharm "braille" moins mais braille toujours ...

    le script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
    from datetime import datetime, timedelta
    from time import sleep
    from os import makedirs, path
    from shutil import rmtree
    from requests import Session
     
     
    # Current Previous DateTime UTC
    c_dt = datetime.utcnow()
    p_dt = c_dt - timedelta(days=1)
    #print('Current DateTime UTC = ', c_dt,
    #      '\nPrevious DateTime UTC = ', p_dt)
     
     
    # Current Previous Date
    c_d = c_dt.strftime('%Y''%m''%d')
    p_d = p_dt.strftime('%Y''%m''%d')
    #print('Current Date =', c_d,
    #      '\nPrevious Date =', p_d)
     
     
    # Hour UTC
    c_h = c_dt.strftime('%H'':''%M')
    #print('Current Hour UTC =', c_h)
     
     
    # Current Previous Obsolete TZ in terms of Current Hour UTC
    def cpo_tz(c_h):
        """ ['Date of current TZ', 'Current TZ', 'Date of previous TZ', 'Previous TZ', 'Obsolete TZ"] """
        if '03:30' <= c_h < '09:30':
            c_tz = '00'
            p_tz = '18'
            o_tz = '12'
            return [c_d, c_tz, p_d, p_tz, o_tz]
        elif '09:30' <= c_h < '15:30':
            c_tz = '06'
            p_tz = '00'
            o_tz = '18'
            return [c_d, c_tz, c_d, p_tz, o_tz]
        elif '15:30' <= c_h < '21:30':
            c_tz = '12'
            p_tz = '06'
            o_tz = '00'
            return [c_d, c_tz, c_d, p_tz, o_tz]
        else:
            c_tz = '18'
            p_tz = '12'
            o_tz = '06'
            return [c_d, c_tz, c_d, p_tz, o_tz]
    #print('Date of current TZ =', cpo_tz(c_h)[0],
    #      '\nCurrent TZ =', cpo_tz(c_h)[1],
    #      '\nDate of previous TZ =', cpo_tz(c_h)[2],
    #      '\nPrevious TZ =', cpo_tz(c_h)[3],
    #      '\nObsolete TZ =', cpo_tz(c_h)[4])
     
     
    # Default path & directories
    path_def = path.expanduser('~')
     
    dir_o_tz = cpo_tz(c_h)[4]
    dir_p_tz = cpo_tz(c_h)[3]
    dir_c_tz = cpo_tz(c_h)[1]
    dir_grb = 'grb'
     
    path_o_tz = path.join(path_def, 'NoaaDownloader', dir_o_tz)
    path_p_tz = path.join(path_def, 'NoaaDownloader', dir_p_tz)
    path_c_tz = path.join(path_def, 'NoaaDownloader', dir_c_tz)
    path_grb = path.join(path_def, 'NoaaDownloader', dir_grb)
     
     
    # Remove Obsolete files & directory if exist
    rmtree(path_o_tz, ignore_errors=True, onerror=None)
     
     
    # Create directories if not exist
    makedirs(path_p_tz, exist_ok=True)
    makedirs(path_c_tz, exist_ok=True)
    makedirs(path_grb, exist_ok=True)
     
     
    # Download TM, previous TZ & current TZ
    s = Session()
    noaaUrl = 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl'
    params = {
        'file': 'file',
        'lev_10_m_above_ground': 'on',
        'var_UGRD': 'on',
        'var_VGRD': 'on',
        'leftlon': '0',
        'rightlon': '360',
        'toplat': '90',
        'bottomlat': '-90',
        'dir': 'dir'
    }
     
    # Download 129 TM of previous TZ
    for p_tm in range(0, 387, 3):
        params['file'] = 'gfs.t' + cpo_tz(c_h)[3] + 'z.pgrb2.1p00.f' + f'{p_tm:03}'
        params['dir'] = '/gfs.' + cpo_tz(c_h)[2] + '/' + cpo_tz(c_h)[3]
     
        if path.exists(path.join(path_p_tz, 'GFS1_' + cpo_tz(c_h)[2] + '_' + cpo_tz(c_h)[3] + '_' + f'{p_tm:03}' + '.grb2')):
            pass
        else:
            r = s.get(noaaUrl, params=params)
            with open(path.join(path_p_tz, 'GFS1_' + cpo_tz(c_h)[2] + '_' + cpo_tz(c_h)[3] + '_' + f'{p_tm:03}' + '.grb2'), 'wb') as f:
                f.write(r.content)
                print('GFS1_' + cpo_tz(c_h)[2] + '_' + cpo_tz(c_h)[3] + '_' + f'{p_tm:03}' + '.grb2')
     
    # Download 129 TM of current TZ, if TM not available, wait 60s
    for c_tm in range(0, 387, 3):
        params['file'] = 'gfs.t' + cpo_tz(c_h)[1] + 'z.pgrb2.1p00.f' + f'{c_tm:03}'
        params['dir'] = '/gfs.' + cpo_tz(c_h)[0] + '/' + cpo_tz(c_h)[1]
     
        r = s.get(noaaUrl, params=params)
        while True:
            if r.status_code != 200:
                print('Waiting ...')
                sleep(60)
            break
     
        r = s.get(noaaUrl, params=params)
        with open(path.join(path_c_tz, 'GFS1_' + cpo_tz(c_h)[0] + '_' + cpo_tz(c_h)[1] + '_' + f'{c_tm:03}' + '.grb2'), 'wb') as f:
            f.write(r.content)
            print('GFS1_' + cpo_tz(c_h)[0] + '_' + cpo_tz(c_h)[1] + '_' + f'{c_tm:03}' + '.grb2')
     
    """
        if c_tm == '006':
            #print('TM' + c_tm + ' c_tz Create 14 TM003')
            continue
        if c_tm == '024':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '048':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '072':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '096':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '120':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '144':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '168':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '192':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '216':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '240':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '264':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '288':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '312':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '336':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '360':
            #print('TM' + c_tm + ' c_tz Create partial grib')
            continue
        if c_tm == '384':
            #print('TM' + c_tm + ' c_tz Create full grib')
            continue
    """

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    J'ai capté l'histoire de la factorisation avec % et effectivement ça évite un paquet de répétition avec if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            if c_tm % 24 == 0 and c_tm != 384:
                [...]
            elif c_tm % 24 == 0 and c_tm == 384:
                [...]
            else:
                continue
    Merci pour le conseil 😉

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Téléchargement de fichier
    Par casafa dans le forum Web & réseau
    Réponses: 21
    Dernier message: 18/06/2009, 23h34
  2. Réponses: 5
    Dernier message: 08/12/2005, 20h13
  3. Téléchargement de fichiers par HTTP / FTP
    Par Gladiator dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 07/12/2005, 11h28
  4. Réponses: 5
    Dernier message: 05/11/2005, 17h53
  5. [SOAP][XML][C#.NET] Téléchargement de fichiers XML
    Par juniorAl dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 27/06/2005, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo