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 :

Fonction pour enregistrer un fichier temporaire sur l'ordinateur


Sujet :

Python

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

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut Fonction pour enregistrer un fichier temporaire sur l'ordinateur
    Bonjour
    je genre mon fichier temporaire , j'ai un menu fichier avec une option "enregistrer et enregistrer-sous" j'aimerais sauvegarder mon fichier temporaire sur n'importe quel emplacement de l'ordinateur quand je clique sur l'option enregistrer
    merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    tu veux une sorte de filebrowser ?

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

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    je veux juste enregistrer un fichier dont je connais le nom et le chemin
    mais c'est quoi le filebrowser ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    je pense qu'il faut regarder dans la lib os.

  5. #5
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu veux dire que le fichier existe déjà dans un dossier "temp" (par exemple),
    si c'est le cas, le module shutil te fera le travail.

    http://docs.python.org/library/shuti...#module-shutil

    regardes copy et copy2

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

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    VinsS oui c'est bien ça , mais à travers un sous-menu : enregistrer
    qui permet d'ouvrir une fenêtre pour sauvegarder mon fichier
    c'est comme l'option Enregistrer dans le menu Fichier
    j'ai testé ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     self.chemin=cheminTemp
        # print self.chemin ca donne le chemin de fichier dans le rep temp
        src = r'self.chemin'
        dst = r'C:\MonDossier'
        for f in os.listdir(src):
            shutil.copy(os.path.join(src, f), os.path.join(dst, f))
    mais ça marche pas

    ci joint les images pour bien comprendre ce que je veux réaliser
    je dispose déjà de mon sous-menu enregistrer et de mon fichier et son chemin dans le répertoire tempp
    maintenant je veux juste pour l'enregistrer là ou je veux quand je clique sur "enregistrer" dans le menu fichier:

    j'ai testé cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     def copyfile(self,source, dest, buffer_size=1024*1024): 
     
            if not hasattr(source, 'read'): 
                source = open(source, 'rb') 
            if not hasattr(dest, 'write'): 
                dest = open(dest, 'wb') 
            while 1: 
                copy_buffer = source.read(buffer_size) 
                if copy_buffer: 
                    dest.write(copy_buffer) 
                else: 
                    break 
            source.close() 
            dest.close()
    mais j'ai un message d'erreur :
    IOError: [Errno 13] Permission denied: 'C:\\MonDossier'
    Images attachées Images attachées   

  7. #7
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je ne vois pas trop ce qui cloche dans ton code, si je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import os
    import shutil
     
    p = os.getcwd()
    d = os.path.join(p, "folder")
     
    for f in os.listdir(p):
        fp = os.path.join(p, f)
        if os.path.isfile(fp):    # s'assurer que c'est un fichier et pas un dossier
            shutil.copy(fp, d)
    Je retrouve bien le contenu de mon bureau dans le dossier folder.
    Eventuellement, rajoutes un print pour "voir" ce qui se passe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        if os.path.isfile(fp):
            print "Copie de %s vers %s" % (fp, d)
            shutil.copy(fp, d)
    Je ne vois qu'un problème de nom.


    Edit : Je viens de voir ton dernier post, je suppose que tu comprend le sens du message d'erreur.

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

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    VinsS ,ton exemple marche mais seulement si on veux copier les fichiers du répertoire de travail actuel .
    si je teste ce simple code (par exemple ) :
    un bouton save :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    self.save.clicked.connect(self.copier)
     
    def copier(self):
            import os
            import shutil
            shutil.copy2('C:\source\fichier.xml', 'C:\DossierDestination')
    ça passe plus , j'ai ce message d'erreur :
    IOError: [Errno 22] invalid mode ('rb') or filename: 'C:\\source\fichier.xml'

    c'est bon j'ai compris pourquoi il fallait rajouter un "r" pour que ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shutil.copy2(r'C:\source\fichier.xml', 'C:\DossierDestination')
    maintenant ,
    je vais essayer de voir avec le menu Fichier-enregistrer car c'est ça ce que je veux réaliser

    j'ai une question
    si on considère que je récupère le chemin du fichier source dans une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.chemin=Source 
    print self.chemin #ça donne C:/cheminFichierSource
    quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     shutil.copy2(r'self.chemin', 'C:\DossierDestination')
    ca passe pas ,
    comment je peux passer en paramètre le self.chemin avec l'option 'r' ?

  9. #9
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Moi je ferais plutôt ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.chemin = unicode(Source)    # prévenir les caractères accentués
     
    shutil.copy2(self.chemin, 'C:\DossierDestination')
    self.chemin sans guillemets

    non ?

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

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    oui , ton code marche bien
    mais j'ai pas encore trouvé une solution à mon problème principal

    la fonction que je cherchais c'était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QFileDialog::getSaveFileName
    comment je peux faire pour transmettre le nom de mon fichier dans le champ "Nom de fichier" à fin de pouvoir l'enregistrer à l'endroit choisi par l'utilisateur
    regarder l'image ci joint pour mieux comprendre
    merci

    ca doit etre un code comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    monFichier = QtGui.QFileDialog.getSaveFileName(self, 
               "Enregistrer un fichier",QtCore.QString(),"C:\monFichier.xml", 
               "Fichier  (*.xml);;Tous (*.*)")
    mais il fonctionne pas
    Images attachées Images attachées  

  11. #11
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est ton QtCore.QString qui va pas

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    chain = u"chemin/du/fichier"
    f = unicode(QtGui.QFileDialog.getSaveFileName(None,
                                        "Save xml file", chain, 
                                        ".xml Files (*.xml)"))

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    merci mais en testant ton code , le programme ne fait plus rien .
    j'ai testé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtGui.QFileDialog.getSaveFileName(self, "C:\monFichier.xml", "donner un nom", self.tr("Text Files (*.xml)"))
    il me crée un fichier vide

  13. #13
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Mais non hein, là tu ouvres juste la boite de dialogue qui te retourne le dossier et le nom de fichier choisit par l'utilisateur mais elle ne sauve rien.

    En plus tu n'as pas respecté ma prose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    chain = u"chemin/du/fichier"
    f = unicode(QtGui.QFileDialog.getSaveFileName(None,
                                        "Save xml file", chain, 
                                        ".xml Files (*.xml)"))
    Ce qui veut dire, dans l'ordre des arguments

    None -- le parent de cette boite, moi je met None parce que je suis fatigué des complaintes de Qt sur ce sujet.

    "Save xml file" -- le titre dans la barre du même nom

    chain -- ce qui s'inscrira dans la zone de saisie du nom de fichier et que l'utilisateur modifiera selon son gout.

    ".xml File (*.xml)" -- ce qui apparaitra en bas à droite comme désignation de type de fichier et en même temps le filtre qui fera en sorte que la boite affichera les fichiers de ce type. l'utilisateur pourra voir plus aisément qu'il n'utilise pas un nom de fichier déjà existant.

    Donc tu as inversé le 2 et le 3, si je lis bien.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    C 'est vrais merci VinsS
    le code permet bien d'enregistrer un fichier mais c'est un fichier vide .
    alors que moi je voudrais que le fichier enregistré soit un fichier déterminé
    je m'explique , suite à des opérations que j'ai effectué j'ai un fichier que j'ai généré dont je connais le nom et l’emplacement et avec cette option enregistrer j'aimerais l'enregistrer là ou je veux ( une sorte de déplacement ).

  15. #15
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Et bien maintenant que la boite de dialogue te retourne le nom du fichier de destination, c'est là que tu dois faire usage de shutil.copy() (ou copy2()) dont il était question précédemment.

    L'utilisateur a la sensation que cette boite est l'outil qui enregistre le fichier à cause de la rapidité de l'action.

    La boite est à peine fermée que le fichier est sauvé, mais en fait du dois rajouter le code avec le retour de la boite.

    Et pour bien faire le mettre dans un try - except au cas ou l'utilisateur n'a pas les permissions sur ce dossier ou si il a choisi un média non inscriptible.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    je vais suivre tes conseils pour voir si je vais régler ce problème

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    voici le code que je viens de tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     chaine=unicode(monFichier)
      fName = unicode(QtGui.QFileDialog.getSaveFileName(None,
                                        "Save xml file", chaine, 
                                        ".xml Files (*.xml)"))
     
       shutil.copy2(chaine,fName)
    il me copie le fichier dans l'endroit que j'ai choisi mais c'est un fichier vide
    il copie pas le contenu

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Points : 93
    Points
    93
    Par défaut
    j'ai meme essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shutil.copyfile(chaine,fName)
    et aussi :
    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
     source=chaine 
            dest=fName 
            buffer_size=1024*1024 
            if not hasattr(source, 'read'): 
                source = open(source, 'rb') 
            if not hasattr(dest, 'write'): 
                dest = open(dest, 'wb') 
            while 1: 
                copy_buffer = source.read(buffer_size) 
                if copy_buffer: 
                    dest.write(copy_buffer) 
                else: 
                    break 
            source.close() 
            dest.close()
    mais toujours le même problème : j'arrive à enregistrer le fichier mais c'est un fichier vide

  19. #19
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    ??

    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    shutil.copy2(chaine,fName)
    te crée un fichier vide, la première idée qui me vient à l'esprit est que le fichier source est vide aussi.

    Vérifications:

    Tu peux l'ouvrir, le fichier source ? l'est pas vide ?

    Si tu testes copy2() en ligne de commande, tu obtiens toujours un fichier vide ?
    (Evidemment, supprimes d'abord le précédent avant d'essayer)

  20. #20
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut
    Dans un premier temps si un modo pouvait déplacer ce topic dans une partie plus générale du forum cela serait peut être plus simple car d'après ce que j'ai vu il ne s'agit pas d'un problème lié à PyQt.

    Je prends un peu le train en route mais pour revenir à ton problème ce petit bout de code ne pourrait-il pas te satisfaire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import os
    import shutil
     
    def macopie():
        shutil.copyfile("c:\dossiersource", "c:\copiedudossiersource")
        os.renames("c:\copiedudossiersource", "c:\toto\tata\titi\copiedudossiersource")
     
    macopie()
    Gros avantage de os.renames : il crée les répertoires nécessaires à la copie du fichier.
    Il ne te suffit plus que d'associer le signal clicked d'un bouton à ce slot et c'est good, non?
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/02/2013, 13h45
  2. Chemin pour enregistrer un fichier sur le serveur
    Par Scrountch dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 11/03/2008, 11h52
  3. [Fichier] Créer un fichier temporaire sur un serveur FTP
    Par kevFrance dans le forum Entrée/Sortie
    Réponses: 15
    Dernier message: 06/03/2006, 10h39
  4. fonction pour lire les fichier audio
    Par tarek007 dans le forum Multimédia
    Réponses: 1
    Dernier message: 11/05/2005, 16h28
  5. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29

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