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 :

importation de fichiers texte de plusieurs repertoire via ftp


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut importation de fichiers texte de plusieurs repertoire via ftp
    Bonjour

    Toute nouvelle sur ce site, merci d'avance pour vos réponses et votre patience!

    Alors, j'ai mon script (qui après mainte tentatives, fonctionne !) qui importe les fichiers d'un dossier via ftp, fais quelques modifications et les déplace dans un nouveau dossier :

    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
     
    # Connexion ssh au serveur
     
    import sys
    sys.path.append('/users/led/sblind/lib/python')
    # nouveau chemin pour que python trouver paramiko
    import paramiko
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('***',username='***',password='***')
    ftp = ssh.open_sftp()
    import ftplib
    ftp = ftplib.FTP('***')
    ftp.login('***','***')
     
    import os
    os.mkdir('/users/led/sblind/fichier_dialogue_corrige')
    import shutil
    rep = '/emospeech/data/dialogues/dialsMidikiTest'
    # repertoire du serveur à transferer
    ext = '*.txt'
    # extraire tous les fichiers texte
    ftp.cwd(rep)
    # changer le repertoire commun
    for fichier in ftp.nlst(ext):
        # demande au serveur d'envoyer le contenu du dossier
        f = open(fichier,'wb')
        ftp.retrbinary('RETR ' + fichier, f.write)
        # tranfert
        shutil.move(fichier,'/users/led/sblind/fichier_dialogue_corrige')
        # déplace les fichiers dans un dossier
        f.close()
    Jusque là pas de problème. Mais maintenant je veux faire un peu plus compliqué.
    Dans mon dossier - ici 'dialogues' se trouve plein de dossiers ayant eux même plein de sous dossiers.

    C a d -> terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    emospeech@labotalc2:~/emospeech/data/dialogues$ ls
    dialsApr212011  dialsMidikiGabrielle25052011  dialsMidikiTest
    dialsMay122011  dialsMidikiGabrielle26052011  experiments
    J'aimerais récupérer tous les fichiers textes de TOUS mes dossiers contenu dans 'dialogues'...

    J'en suis là :

    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
     
    import sys
    sys.path.append('/users/led/sblind/lib/python')
    import paramiko
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('***',username='***',password='***')
    ftp = ssh.open_sftp()
    import ftplib
    ftp = ftplib.FTP('***')
    ftp.login('***','***')
    '230 Welcome on ***'
     
    rep = '/emospeech/data/dialogues'
    ext ='*.txt'
     
    def download(rep):
        ftp.cwd(rep)
        ext = '*.txt'
        for fichier in ftp.nlst(ext):
            f = open(fichier, 'wb')
            ftp.retrbinary('RETR ' + fichier, f.write)
            f.close()
        down_dir()
     
    def down_dir():
        for directory in ftp.nlst():
            if ftp.cwd(directory):
                download(directory)    
     
    import ftplib
    try:
        download(ftp.pwd())
    except Exception, error:
        print str(error)
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    450 No files found
    Rien...

    Si quelqu'un a une idée, merci !

  2. #2
    Membre Expert

    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
    Par défaut
    Tout d’abords, une remarque. Dans cette partie de code,

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import paramiko
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('***',username='***',password='***')
    ftp = ssh.open_sftp()
    import ftplib
    ftp = ftplib.FTP('***')
    ftp.login('***','***')

    …tu as bien conscience que tout le truc avec paramiko, ssh et open_sftp ne sert à rien*? En effet, tu écrases ensuite ftp avec une connexion FTP on ne peut plus standard, et pas du tout sécurisée*!

    Ensuite, pour ta question, je crois que ton problème viens des dossiers vides (ou de dossiers ne contenant aucun fichier .txt). Dans ce cas, le serveur FTP doit renvoyer un code d’erreur (450), que la bibliothèque FTP transforme en exception python.

    Tu devrais donc, je pense, placer tes nlst dans des try/except, et filtrer les exceptions, puisque la 450 n’est pas une erreur, elle signale simplement que le listage n’a rien retourné, et/ou que le chemin demandé n’existe pas. Quelque chose comme ça*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def down_dir():
        try:
            for directory in ftp.nlst():
                if ftp.cwd(directory):
                    download(directory)
        except ftplib.error_temp, e:
            if not e.args[0].startswith('450'):
                raise e

    À adapter en fonction de tes besoins… Ton serveur n’a pas l’air d’être standard, au fait (ftpd, par exemple, se contente de retourner un résultat vide, sans code d’erreur, quand on liste un répertoire vide ou inexistant)…

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Salut, merci pour ta réponse!

    Alors, pour ta première remarque, je suis toute débutante, en python et en ftp, mais ça m'a paru bizarre aussi ^^"
    Le problème c'est que avec paramiko tout seul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import sys
    sys.path.append('/users/led/sblind/lib/python')
    import paramiko
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('***',username='***',password='***')
    ça me donnait :

    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
     
    Traceback (most recent call last):
      File "/users/led/sblind/emospeech-ssh.py", line 20, in <module>
        ftp.cwd(rep)
      File "/usr/lib/python2.7/ftplib.py", line 543, in cwd
        return self.voidcmd(cmd)
      File "/usr/lib/python2.7/ftplib.py", line 248, in voidcmd
        self.putcmd(cmd)
      File "/usr/lib/python2.7/ftplib.py", line 178, in putcmd
        self.putline(line)
      File "/usr/lib/python2.7/ftplib.py", line 173, in putline
        self.sock.sendall(line)
      File "/usr/lib/python2.7/socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    error: [Errno 32] Broken pipe
    Oui, j'ai pensé à cette raison aussi, le problème c'est que aucun des dossiers n'est vide et tous ne possèdent QUE des fichiers texte... oO

    Ah bah ça tombe bien, je vais apprendre tout ce qui est try/except du coup, j'connaissais pas trop...
    J'ai mis des print un peu partout aussi, pour voir ou pourrait être le problème :

    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
     
    rep = '/emospeech/data/dialogues'
     
     
    def download(rep):
        print download
        ftp.cwd(rep)
        print ftp.cwd(rep)
        print rep
        ext = '*.txt'
        try:
            for fichier in ftp.nlst(ext):
                print ftp.nlst(ext)
                print ext
                f = open(fichier, 'wb')
                print f
                ftp.retrbinary('RETR ' + fichier, f.write)
                print f
                f.close()
            down_dir()
     
     
    def down_dir():
        print down_dir()
        try:
            for directory in ftp.nlst():
                if ftp.cwd(directory):
                    print ftp.cwd
                    download(directory)
        except ftplib.error_temp, e:
            if not e.args[0].startswith('450'):
                raise e                    
     
     
     
    print download(rep)
    print down_dir()
    Donne :

    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
     
    <function download at 0xa5c7c34>
    250 CWD command successful
    /emospeech/data/dialogues
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        download(rep)
      File "/users/led/sblind/emospeech-ssh.py", line 22, in download
        try:
      File "/usr/lib/python2.7/ftplib.py", line 499, in nlst
        self.retrlines(cmd, files.append)
      File "/usr/lib/python2.7/ftplib.py", line 436, in retrlines
        return self.voidresp()
      File "/usr/lib/python2.7/ftplib.py", line 224, in voidresp
        resp = self.getresp()
      File "/usr/lib/python2.7/ftplib.py", line 217, in getresp
        raise error_temp, resp
    error_temp: 450 No files found

  4. #4
    Membre Expert

    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
    Par défaut
    Bah pour paramiko, je ne vais pas pouvoir t’aider, je ne connais pas…

    Le truc de mettre des print partout est un bon réflexe (même si là, t’y as quand même peut-être été un peu fort ) –*attention cependant à bien les placer (les deux lignes 13 et 14 seraient mieux hors de la boucle for, par exemple…).

    Tu dis qu’aucun de tes dossiers n’est vide, mais je suppose qu’ils ne contiennent pas tous des fichiers texte*? Par exemple, “/emospeech/data/dialogues” en contient-il*? D’après le message d’erreur, je dirais plutôt qu’il ne contient que des sous-dossiers, comme le “dialsMidikiTest” de ton premier post*?

    Sinon, tu as aussi mis un try dans download(), c’est bien, mais il manque la même partie except que pour down_dir()*!

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Ah oui, désolée, effectivement “/emospeech/data/dialogues” ne contient que des sous dossiers et aucun fichier texte. Et y a d'autres sous dossiers qui ne contiennent eux aussi que des sous dossiers.

    Alors, nouvelle tentative, avec la partie except qui manquait et des print plus corrects :

    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
     
    ftp = ftplib.FTP('***')
    ftp.login('***','***')
     
    rep = '/emospeech/data/dialogues'
     
    import ftplib
     
    def download(rep):
        ftp.cwd(rep)
        ext = '*.txt'
        try:
            for fichier in ftp.nlst(ext):
                print fichier
                f = open(fichier, 'wb')
                ftp.retrbinary('RETR ' + fichier, f.write)
                f.close()
            down_dir()
        except ftplib.error_temp, e:
            if not e.args[0].startswith('450'):
                raise e 
     
     
    def down_dir():
        try:
            for directory in ftp.nlst():
                if ftp.cwd(directory):
                    print directory
                    download(directory)
        except ftplib.error_temp, e:
            if not e.args[0].startswith('450'):
                raise e
    Aucune réaction, aucun résultat, mais pas de message d'erreur non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
    [GCC 4.5.2] on linux2
    Type "copyright", "credits" or "license()" for more information.
    ==== No Subprocess ====
    >>> 
    >>>
    Et sinon, merci beaucoup !

Discussions similaires

  1. lister les noms et les contenu des plusieurs fichier texte dans meme repertoire
    Par annonceurs83 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/03/2012, 00h01
  2. Réponses: 1
    Dernier message: 01/06/2010, 17h25
  3. Réponses: 3
    Dernier message: 01/08/2006, 15h18
  4. Réponses: 2
    Dernier message: 02/02/2006, 18h21
  5. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56

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