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

Réseau/Web Python Discussion :

ftplib, filezilla et utf8


Sujet :

Réseau/Web Python

  1. #1
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut ftplib, filezilla et utf8
    Hello,

    J'essaye d'écrire un script pour copier/mirrorer un répertoire local sur un site FTP distant avec la librairie standard ftplib en python 3.2.
    Ca marche bien, sauf les accents !
    J'ai déjà copié une partie avec Filezilla, où le serveur est configuré en UTF8. Mais je n'arrive pas à traiter les fichiers ou les répertoires avec des accents, l'encodage ne semble pas le même.

    Mon 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
     
    # -*- coding:utf-8 -*-
    from ftplib import FTP
    import sys
     
    USER = 'user'
    PASS = 'pwd'
    SERVER = 'server.dns.com'
    PORT = 21
     
    print("connection")
    ftp = FTP()
    ftp.connect(SERVER, PORT)
    ftp.login(USER, PASS)
    print("etat", ftp.getwelcome())
    ftp.set_pasv(True)
     
    ftp.sendcmd("OPTS UTF8 ON")  # pour passer en UTF8 comme dans Filezilla
     
    ftp.cwd('/test')
    #le répertoire /test distant contient uniquement un fichier tést.txt
     
    print("test création répertoire avec accents")
    ftp.mkd("aéo1")
    ftp.sendcmd("MKD aéo2")         # autre méthode ...
     
    print("test récupération des éléments du répertoire")
    x=ftp.nlst()
    print(x)
    # ['.', '..', 'aéo1', 'aéo2', 'tést.txt']
     
    # résultats sous filezilla :
    # en forçant l'UTF8, on a aéo1  aéo2 tést.txt mais impossible de rentrer / modifier les répertoires aéo1 et aéo2.
    # sinon avec le jeu de caractères local : aéo1 aéo2 et tést.txt
     
    # test avec encodage UTF8 ... enfin je crois j'ai vu ça quelquepart ...
    cmd="MKD aéo3"
    ftp.sendcmd(cmd.encode('utf-8'))
    # erreur TypeError: can't concat bytes to str
     
    ftp.quit()
    Là je suiis perdu
    Il me semblait qu'en v3 python les chaînes de caractères étaient par défaut codées en UTF8 ...

    Comment je peux récupérer les noms des fichiers avec les bons accents sur le serveur FTP ?

    Merci
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    ça fait un moment que j'ai pas fait de transfert FTP. Mais de memeoire, il n'y a pas une option pour choisir entre mode de transmission ASCII (table ascii, donc pas d'accent) et binaire (copie conforme)? Je sait que j'avais souvent des soucis avec filezilla avec ce parametrage.

    EDIT: je sais pas si cela peut taider en plus: http://python.developpez.com/tutoriels/python-en-bref/#LV-L
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Python3 est par défaut utf-8 mais les protocoles réseau ont leurs propres "default".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ftp.sendcmd("OPTS UTF8 ON")  # pour passer en UTF8 comme dans Filezilla
    ftp.encoding='utf-8' # <-- ajoutez cette ligne juste après.
    Citation Envoyé par deusyss Voir le message
    ça fait un moment que j'ai pas fait de transfert FTP. Mais de memeoire, il n'y a pas une option pour choisir entre mode de transmission ASCII (table ascii, donc pas d'accent) et binaire (copie conforme)? Je sait que j'avais souvent des soucis avec filezilla avec ce parametrage.[/URL]
    Si c'est une question pourquoi ne pas la poster?

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

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Sur mon site web, je n'ai pas le serveur filezilla mais le proFTPD. Cependant, pour certaines opérations, par exemple pour avoir la taille d'un fichier avec .size, il est nécessaire de demander le mode binaire. Je le fais avec:

    Ce n'est pas sur la doc de ftplib, mais ça marche.

    A essayer!

    [edit] je viens d'essayer pour le problème d'encodage, et je ne rencontre aucun problème.

    Avec le serveur ftp proFTPD et Python 3.2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # crée un répertoire avec des accents (repdest=le répertoire ftp dans lequel on fait l'opération)
    rep = "abcéèçàùôï"
    ftp.mkd(repdest + '/' + rep)
    Avec mon client ftp filezilla, je constate que le répertoire a bien été créé correctement.

    Et le supprimer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftp.rmd(repdest + '/' + rep)
    Le script Python 3 est encodée et stockée sur disque en utf-8 , mais lors de l'exécution, les chaines de caractères sont converties en unicode interne par défaut (unicode interne=version simplifiée de l'utf-16 _ 2 octets par caractère). Et les fonctions de ftplib semblent avaler l'unicode sans discuter. Mais peut-être que mon serveur ftp "proFTPD" ne fonctionne pas de la même façon que le serveur filezilla?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Hello,

    Merci de vos réponses

    Citation Envoyé par deusyss Voir le message
    Mais de memeoire, il n'y a pas une option pour choisir entre mode de transmission ASCII (table ascii, donc pas d'accent) et binaire (copie conforme)?
    A ce que j'ai compris dans python cela correspond aux commandes retrlines, retrbinary, storlines et storbinary. Ou alors passer par la commande ftp "TYPE I" comme le dit tyrtamos ... Mais même avec ça ça ne marche pas pour les accents dans les noms de fichiers
    je sais pas si cela peut taider en plus: http://python.developpez.com/tutoriels/python-en-bref/#LV-L
    Très bon tuto, je l'ai suivi pour débuter en python
    Mais il ne parle pas des problèmes d'accents

    Citation Envoyé par tyrtamos Voir le message
    Sur mon site web, je n'ai pas le serveur filezilla mais le proFTPD. Cependant, pour certaines opérations, par exemple pour avoir la taille d'un fichier avec .size, il est nécessaire de demander le mode binaire. Je le fais avec:
    Je me suis mal exprimé, je prends Filezilla client pour contrôler les fichiers envoyés (et aussi envoyer certains fichiers manuellement). Le serveur FTP est un Pure-FTPd sur un NAS distant (sous linux). Dans le gestionnaire des sites FTP de Filezilla il y a un onglet "Jeu de caractères" où on peut donner l'encodage des caractères pour les noms des fichiers. J'ai mis par défaut UTF-8. Et ça ne pose pas de problème dans l'affichage des dossiers sur la console web du NAS, ou via samba.

    Avec mon client ftp filezilla, je constate que le répertoire a bien été créé correctement.
    Pareil pour moi, mais :
    • le nom du fichier envoyé précédemment est erroné dans Filezilla (tést.txt au lieu de tést.txt) alors que les objets créés sous python apparaissent bien
    • dans la console FTP j'ai "Séquence de caractères reçue invalide, désactivation de UTF-8. Sélectionnez l'option UTF-8 dans le Gestionnaire de Sites pour forcer l'utilisation d'UTF-8."


    A ce que j'ai vu sur le net, ftplib est une des librairies qui n'a pas été entièrement revue en UTF-8 ... Et je ne m'en sors pas avec les encodages
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par doc malkovich Voir le message
    A ce que j'ai vu sur le net, ftplib est une des librairies qui n'a pas été entièrement revue en UTF-8 ... Et je ne m'en sors pas avec les encodages
    Par défaut, l'encoding de ftplib est "latin-1" (c'est ce que vous avez dans instance ftp.encoding).
    Si vous dites "cause moi en utf-8" avec le ftp.sendcmd("OPTS UTF8 ON"), le 'é' de tést.txt sera encodé sur 2 bytes en utf-8 mais son "rendu" en latin-1, va sortir le 'é' en deux glyphs: tést.txt.
    D'où le nécessaire ftp.encoding = 'utf-8'.
    Mais il n'est pas certain qu'il soit suffisant pour toutes les commandes "ftp", car les RFC sur le sujet ne sont pas assez "strictes" pour permettre aux développeurs de s'en sortir proprement.

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

  7. #7
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Ma foi, la solution d'ajouter
    ftp.encoding = 'utf-8'
    me convient, les méthodes que j'utilise ont retrouvé les accents

    Je me contenterai de celles-là si elles marchent !

    Merci wiztricks
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    L'encoding des noms de fichiers passé dans les commandes ftp n’intéresse que les échanges entre le client et le serveur ftp.
    Le programmeur Python se contente d'expédier et de récupérer des "strings" en Unicode avec le client.
    Il se fout pas mal de savoir comment sera sérialisé le dialogue entre le client et le serveur.
    S'il habite en Europe de l'Ouest, "latin-1" est assez bon même si c'est en dehors des clous des "standards" FTP: ASCII ou UTF8, les autres encodings sont "indéfinis" et non supportés.

    Une amélioration de la ftplib pourrait être l'ajout de méthodes ".set_utf8_encoding_{on|off}" qui s'occupe d'expédier un FEAT pour s'assurer que le serveur "supporte" UTF8, expédie l'OPTS UTF8 ON, mette à jour .encoding,...
    En attendant, c'est au programmeur d'écrire ces quelques lignes.

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

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

Discussions similaires

  1. [ftplib] Prob de telechargement en ftp
    Par DiGiTAL_MiDWAY dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 09/12/2004, 17h53
  2. Réponses: 5
    Dernier message: 19/11/2004, 19h16
  3. Réponses: 3
    Dernier message: 28/10/2004, 08h39
  4. Convertir une chaine UTF8 en ISO-8859-1
    Par eods dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/08/2004, 16h57
  5. Réponses: 2
    Dernier message: 23/06/2004, 16h06

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