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 :

Enregistrement d'un fichier télécharger


Sujet :

Python

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut Enregistrement d'un fichier télécharger
    Bonjour à tous,

    j'ai une simple petite question sur la méthode à utiliser pour enregistrer un fichier téléchargé via urllib2:

    la première methode, qui ouvre et referme toujours le fichier a écrire pour éviter de le charger en mémoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while True:
    	saveFile = open(dest, "ab")
    	chunk = page.read(chunk_size)
    	saveFile.write(chunk)
    	saveFile.close()
    	bytes_so_far += len(chunk)
    	if not chunk:
    		break
    	if report_hook:
    		report_hook(int(bytes_so_far/chunk_size), chunk_size, total_size)
    ou tout d'une seule traite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    saveFile = open(dest, "wb")
    while True:
    	chunk = page.read(chunk_size)
    	saveFile.write(chunk)
    	bytes_so_far += len(chunk)
    	if not chunk:
    		break
    	if report_hook:
    		report_hook(int(bytes_so_far/chunk_size), chunk_size, total_size)
    saveFile.close()
    ceci sachant que le script pourra servir à télécharger de gros fichier de plus d'1Go

    Merci

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Ben je dirais, la deuxième… on pourrait même l’améliorer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with open(dest, "wb") as saveFile:
        chunk = page.read(chunk_size)
        while chunk:
            saveFile.write(chunk)
            saveFile.flush() # Pas obligatoire, cela forcera l’écriture réelle du chunk dans le fichier.
            bytes_so_far += len(chunk)
            if report_hook:
                report_hook(int(bytes_so_far/chunk_size), chunk_size, total_size)
            chunk = page.read(chunk_size)
    Avec un p’tit flush() pour s’assurer que les chunks sont immédiatement écrits sur le disque, éventuellement…

    En tout cas, fermer/rouvrir le fichier à chaque chunk me semble inutilement lourd

  3. #3
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    et de cette façon le fichier n'est pas chargé en mémoire vive n'est-ce pas ? du fait du flush() je suppose ?

    si c'est le cas c'est pile ce que je cherchais ^^

    j'aimerai pouvoir écrire des fichiers à la volée, en évitant que ceux-ci, parfois de plusieurs 100aine voir milliers de Mo ne soient chargé en mémoire ^^

    Merci

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Un fichier n’est jamais chargé en mémoire vive quand tu l’ouvres, et encore moins quand tu ne l’ouvres qu’en écriture. L’OS se contente de le “mapper” en mémoire virtuelle, puis il lit vraiment sur le disque uniquement à la demande, quand le fichier est lu par l’application.

    De plus, en écriture, seul le tampon d’écriture est conservé en mémoire vive (si l’on exclue les optimisations propres à chaque OS), et il est périodiquement écrit sur le disque (là encore, c’est géré par l’OS, à moins que tu n’appelles flush(), qui force l’OS à écrire sur le disque).

    Donc, à moins de lire l’intégralité de ton fichier d’un coup, l’OS se chargera toujours de n’en conserver en RAM que ce qui est nécessaire

  5. #5
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Merci bien pour toutes ces précisions
    Résolu =)

    Edit:
    aah non,
    encore une petite question,
    dans ton script, l'utilisation de "with open(dest, "w+") as saveFile:" fait qu'il n'y a pas besoin de saveFile.close() ?

  6. #6
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Et non !
    Vas voir sur la doc de Python pour les détails (http://docs.python.org/py3k/referenc...with-statement et la http://www.python.org/dev/peps/pep-0343/), mais pour faire vite, with permet d’obtenir en une seule ligne un équivalent à try…except…finally… . Autrement dit, l’item qui est créé par “with expr as item” (c’est un type d’objet particulier, un “context manager”) sera proprement finalisé, quoi qu’il arrive (même si une exception survient). Pour un fichier créé de cette manière, cela revient à un appel automatique à close()… Pratique, non ?

  7. #7
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Effectivement c'est bon à savoir, je crois que je vais revoir certain de mes scripts ^^

    Merci encore,
    à une prochaine

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

Discussions similaires

  1. [XL-2010] Télécharger et enregistrer sous un fichier Excel dans IE9 Windows 7
    Par francoiscrna dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 03/03/2015, 15h06
  2. [LG]Enregistrements dans un fichier
    Par ticoude dans le forum Langage
    Réponses: 1
    Dernier message: 26/11/2004, 19h33
  3. Enregistrement d'un fichier Excel par automation
    Par tiopan dans le forum Access
    Réponses: 2
    Dernier message: 04/12/2003, 20h57
  4. [LG]supprimer un enregistrement dans un fichier
    Par Marcus2211 dans le forum Langage
    Réponses: 10
    Dernier message: 17/11/2003, 01h59
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 16h17

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