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 :

Fichier corrompu lors d'un téléchargement.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut Fichier corrompu lors d'un téléchargement.
    Bonjour,
    Je suis confronté à un soucis aléatoire lorsque je télécharge les fichiers grib (.grb2) à la NOAA.
    J'ai l'impression que de temps à autre, je tombe pile poil au moment où le fichier est mis a dispo et donc il ne le télécharge que "partiellement" ce qui plus tard me fait planter le script.

    Voici le code que j'utilise (simplifié):
    Code PYTHON : 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
     
    from requests import Session
     
    [...]
    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'
    }
     
    for CURR_TM in range(0, 387, 3):
        params['file'] = 'gfs.t' + TZ + 'z.pgrb2.1p00.f' + TM
        params['dir'] = '/gfs.' + YYYYMMDD + '/' + TZ
     
        grb2file = 'GFS1_' + YYYYMMDD + '_' + TZ + '_' + TM + '.grb2'
     
        while True:
            r = s.get(noaaUrl, params=params)
            if r.status_code != 200:    # r.status_code != requests.codes.ok
                print('Waiting ...')
                sleep(60)
            else:
                break
     
        r = s.get(noaaUrl, params=params)
        with open(join(PATH_FOLDER_GRB2, grb2file), 'wb') as f:
            for chunk in r.iter_content(chunk_size=None):
                f.write(chunk)
    [...]

    Est ce que quelque chose choc dans ce bout de code ?

    J'essaye en général de me débrouiller par moi même mais là clairement je sais plus trop où chercher pour résoudre mon soucis ...

    Y'a t'il un moyen de vérifier l'intégrité du fichier téléchargé ? Si oui vers quelle méthode se tourner ?

    J'ai pensé à utiliser Try: ... Except "Error" : ... pour relancer le script en cas de plantage car il plante plus loin quand j'exploite le fichier corrompu, mais résoudre cette histoire " d'intégrité du fichier " me semble plus appropriée.

    Merci de vos lumières 😉

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 787
    Par défaut
    Salut,

    Il faut déjà préciser le type de la corruption: il manque des blocks, la fin du fichier,... c'est pas pareil que s'il y a des bytes inversés çà et là.

    J'ai l'impression que de temps à autre, je tombe pile poil au moment où le fichier est mis a dispo et donc il ne le télécharge que "partiellement" ce qui plus tard me fait planter le script.
    Avec un peu de chance, la taille du fichier a été transmise dans l'en-tête.
    Si elle est cohérente avec le nombre de bytes récupérés, c'est que le serveur a expédié le fichier dans l'état où il l'a trouvé lors de la requête. Bizarrerie à signaler au webmaster.... et en attendant, il va falloir trouver un truc permettant de tester que le fichier n'est pas en cours de création.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut
    Pour le type de la corruption j'en sais rien, le fichier n'est pas complet c'est tout ce que je vois.
    En moyenne un TM avec les params que j'utilise (10m above ground, UGRID, VGRID) fait env 155 Ko, quand le fichier est corrompu il fait 455 octets.

    J'ai regardé dans l'entête et voici ce qu'elle contient
    Code JSON : 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
     
    {
        'Date': 'Sat, 26 Dec 2020 16:19:30 GMT',
        'Server': 'Apache',
        'X-Frame-Options': 'SAMEORIGIN, SAMEORIGIN',
        'X-Content-Type-Options': 'nosniff, nosniff',
        'X-XSS-Protection': '1; mode=block, 1; mode=block',
        'Content-Transfer-Encoding': 'binary',
        'Content-Disposition': 'attachment; filename="gfs.t06z.pgrb2.1p00.f006"',
        'Content-Description': 'grib2 file',
        'Content-Type': 'application/octet-stream',
        'Via': '1.1 nomads.ncep.noaa.gov-80',
        'Cache-Control': 'max-age=14400',
        'Expires': 'Sat, 26 Dec 2020 20:19:30 GMT',
        'Keep-Alive': 'timeout=300, max=100',
        'Connection': 'Keep-Alive',
        'Transfer-Encoding': 'chunked',
        'Strict-Transport-Security': 'max-age=31536000; includeSubdomains; preload',
        'Set-Cookie': 'NSC_opnbet-cmes-ttm=ffffffff09a49e4145525d5f4f58455e445a4a423660;path=/;secure;httponly'
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Quelle est la taille de ces fichiers ?
    Si ce sont des fichiers d'un Mo ou plus il est préférable de les télécharger en streaming.
    Voir ici: https://requests.readthedocs.io/en/l...e.iter_content

    Tu peux connaître la taille des fichiers avant téléchargement.
    Avec urllib.request j'utilise ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    with contextlib.closing(urllib.request.urlopen(url, None, 6)) as fp:
        headers = fp.info()
        if "content-length" in headers:
            size = int(headers["Content-Length"])
    Avec Requests ce devrait être similaire.

    Donc, ensuite, tu peux comparer la taille du fichier a la valeur de "content-length" et t'assurer qu'il est bien complet.

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut
    il apparait pas 'Content-Length' dans l'entête justement, il me retourne donc 0.

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je suppose que tu as les spécifications de ces fichiers puisque tu les utilises et la taille du fichier ou des données est peut-être indiquée dans l'entête, après le magic-number qui sont les premiers octets

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Par défaut
    Là tu m'as perdu 😖

    Je suis pas un As du Python j'en comprends juste les grandes lignes quand aux gribs en eux même, j'utilise CDO (Climate Data Operators) pour les manipuler, tout ce qui sort de ce cadre est inconnu pour moi ...

    Pour faire simple, je pourrais pas ajouter un " Si le fichier grb2 ne fait pas entre 150 et 160 Ko, tu me le retélécharges sinon le script continue "
    C'est pas génial comme solution mais pourrais être fonctionnelle, non ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Bien sûr que tu peux faire cela mais ici https://www.weather.gov/mdl/grib_design je vois ceci:
    ------------------------------------------------------------------
    GRIB2 files for a given element and region will be split into two files, one containing the forecast grids for the period Day 1 through Day 3, the other containing the forecast grids for the period Day 4 through Day 7. These files are located in different directories at the NWSTG FTP download site.

    Every NDFD GRIB file begins with a flag field separator of the format:
    ****nnnnnnnnnn****\lf

    where the "nnnnnnnnnn" is the size in bytes of the file, (minus the separator), right justified with leading zeroes, and with a trailing "\lf". The "\lf" character represents a single octet with the decimal value of 10. The size of the Flag field separator is 19 bytes.
    ------------------------------------------------------------------

    Donc tu peux essayer ceci sur tes fichiers déjà correctement téléchargés pour voir si mon code est juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    with open(filename, 'rb') as infile:
        block = list(infile.read(19))
        num = []
        for c in block[4:15]:
            if chr(c).isdigit():
                num.append(chr(c))
            else:
                raise
     
        size = int(''.join(num))
        print("Size of %s: %s bytes" %(filename, size+19))

Discussions similaires

  1. [Débutant] fichier corrompu lors de l upload ftp
    Par bobylastar49 dans le forum C#
    Réponses: 3
    Dernier message: 15/01/2013, 10h33
  2. fichier corrompu lors de l'install de visual studio2010
    Par guaguanco dans le forum Visual Studio
    Réponses: 5
    Dernier message: 28/07/2010, 09h36
  3. Fichier corrompu après téléchargement HTTP
    Par PP(Team) dans le forum C++
    Réponses: 2
    Dernier message: 26/04/2007, 09h09
  4. Pb nom du fichier lors d'un téléchargement forcé
    Par wolfe dans le forum Langage
    Réponses: 2
    Dernier message: 14/02/2007, 10h49
  5. [VWD 2005][Upload]Fichier corrompu lors de l'Upload
    Par DonkeyMaster dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 16/01/2007, 22h24

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