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 :

Nom de fichier trop long


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 70
    Points : 8
    Points
    8
    Par défaut Nom de fichier trop long
    Bonjour,

    Je me tire les cheveux depuis trois jours sur ce problème !!

    Je suis sous Windows8 avec python 2.7.5. (choix justifié par l'utilisation de certaines lib non porté sur Python3).

    J'ai dans un script une fonction qui me calcule la taile d'un répertoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        def _get_size(self):
            """Renvoi la taille du dossier."""
            size = 0
            for rep, sous, files in os.walk(self.path):
                for file in files:
                    size += os.path.getsize(os.sep.join((rep, file)))
            return size
    Or arrivée à ce fichier

    c:\Users\Frederic\AppData\Local\Packages\WinStore_cw5n1h2txyewy\AC\Microsoft\Windows Store\Cache\0\0-Namespace-https∺∯∯services.apps.microsoft.com∯browse∯6.2.9200-1∯615∯fr-FR∯c∯FR∯Namespace∯pc∯00000000-0000-0000-0000-000000000000∯00000000-0000-0000-0000-000000000000.dat
    Le script me génère une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      File "c:\Program Files (x86)\Python27\lib\genericpath.py", line 49, in getsize
     
        return os.stat(filename).st_size
    WindowsError: [Error 3] Le chemin dÆaccÞs spÚcifiÚ est introuvable: u'c:\\Users\\Frederic\\AppData\\Local\\Packages\\WinStore_cw5n1h2txyewy\\AC\\Microsoft\\Windows Store\\Cache\\0\\0-Namespacehttps\u223a\u222f\u222fservices.apps.microsoft.
    com\u222fbrowse\u222f6.2.9200-1\u222f615\u222ffrFR\u222fc\u222fFR\u222fNamespace\u222fpc\u222f00000000-0000-0000-0000-000000000000\u222f00000000-0000-0000-0000-000000000000.dat'
    Donc d'après ce que je comprend le nombre de caractère étant supérieur à 255, le fichier n'est pas "trouvé".

    Quelqu'un aurait il eu ce type de problème et a t il réussi à le résoudre ?

    Merci de vos réponses.

  2. #2
    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,
    C'est un problème windows qui se traite avec des "trucs" windows.
    Voir plus particulièrement lorsqu'ils parlent de "\\?\" prefix
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Mai 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 70
    Points : 8
    Points
    8
    Par défaut
    Super W,

    Merci

    Je l'ai traiter ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        def _get_size(self):
            """Renvoi la taille du dossier."""
            if os.name == "nt":
                # prefix utilisé sur windows pour la prise en charge 
                # des longs noms de fichiers.
                prefix_env = "\\\?\\"
            else:
                prefix_env = ""
            size = 0
            for rep, sous, files in os.walk(self.path):
                for file in files:
                    size += os.path.getsize(prefix_env + os.sep.join((rep, file)))
            return size
    Il y a peut être une manière plus élégante de le gérer.

  4. #4
    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,

    os.path.join() n'aurait pas fait l'affaire à la place de os.sep.join(), la première méthode prie Python de bien faire les choses selon l'os sous lequel il tourne, la deuxième est une méthode de string, ce qui n'est pas pareil.

  5. #5
    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,

    Citation Envoyé par VinsS Voir le message
    os.path.join() n'aurait pas fait l'affaire à la place de os.sep.join(), la première méthode prie Python de bien faire les choses selon l'os sous lequel il tourne, la deuxième est une méthode de string, ce qui n'est pas pareil.
    os.path.join transforme une liste d’éléments d'un chemin dans la syntaxe locale. Un gros intérêt cote portabilité est lorsqu'on a un répertoire "racine", genre '~/myapp' qui sera une "constante" exprimée avec des séparateurs UNIX-like a composer avec un truc local 'foo\bar.txt'.
    Ici on ajoute "rep" a "file" qui sont des trucs "locaux" retournes par os.walk: os.sep.join "suffit" et sera plus efficace.

    Une optimisation pourrait être l'ajout du "prefix" dans le path passe a os.walk, comme il "remonte" dans "rep", le cas "nt" pourrait se simplifier. Apres, on peut ajouter du Pythonique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       def _get_size(self):
            """Renvoi la taille du dossier."""
            if os.name == "nt":
                path = "\\\\?\\" + os.path.abspath(self.path)
            getsize=os.path.getsize
            join=os.sep.join
            size = 0
            for rep, sous, files in os.walk(path):
                size += sum(getsize(join([rep, f])) for f in files)
            return size
    - 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. Noms de fichiers trop long
    Par Maxmoon13 dans le forum C#
    Réponses: 0
    Dernier message: 15/04/2014, 12h09
  2. Problème de compilation et nom fichier trop long
    Par m.joseph dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/01/2010, 15h55
  3. unix to AS400 : nom de fichiers trop long
    Par funfox dans le forum AS/400
    Réponses: 4
    Dernier message: 05/03/2009, 09h35
  4. Nom de fichier trop long (nombreux fichiers)
    Par gretch dans le forum Windows XP
    Réponses: 10
    Dernier message: 14/03/2008, 17h09
  5. getOutputStream() : nom de fichier trop long
    Par joseph_p dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/06/2006, 11h55

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