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 :

Path.Rename() retourne une erreur chemin introuvable quand le chemin est récupéré de mon fichier de config. [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Achats
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Achats

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Path.Rename() retourne une erreur chemin introuvable quand le chemin est récupéré de mon fichier de config.
    Bonjour,

    Je cherche à renommer un fichier avec la date du jour. Le chemin est construit à partir de valeurs de mon fichier .ini, en utilisant un objet Path de PathLib.
    En passant le chemin à la fonction Path.Rename(), Python me retourne une erreur "WinError 3" # Chemin introuvable.


    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
     
    # on commence par identifier le fichier existant
    # => construction du chemin à partir du fichier .ini   -> on récupère le dossier, on y ajoute le nom du fichier
    file = Path(config.get('path','target_files_path') , config.get('files','target_file'))
    # print => G:\Partagé\Power BI\Processing\CC3\CC3_for_report.xlsx
     
    # Suffixe que je vais rajouter au nom du fichier, avant l'extension. En gros, la date du jour
    suffix = "20210509"
     
    #On va remplacer nom_fichier.extension par nom_fichier_suffix.extension
    try:
        # on récupère l'extension du fichier file
        file_extension = PurePath(file).suffix
        # on récupère le nom du fichier file, sans l'extension
        file_name = PurePath(file).stem
        # on construit le nouveau chemin/nom  qui va remplacer le nom existant
        file_new_name = Path(PurePath(file).parent, file_name + '_' + suffix + file_extension)
        # print => G:\Partagé\Power BI\Processing\CC3\CC3_for_report_20210509.xlsx
     
        # on exécute le renommage
        Path(file).rename(file_new_name)
    Je vous mets la version sans commentaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    file = Path(config.get('path','target_files_path') , config.get('files','target_file'))
    suffix = "20210509"
     
    try:
        file_extension = PurePath(file).suffix
        file_name = PurePath(file).stem
        file_new_name = Path(PurePath(file).parent, file_name + '_' + suffix + file_extension)
     
        Path(file).rename(file_new_name)
    Et ça me retourne l'erreur : [WinError 3] Le chemin d�acc�s sp�cifi� est introuvable: 'G:\\Partagé\\Power BI\\Processing\\CC3\\CC3_for_report.xlsx
    Je précise que je suis bien en UTF8 (# -*- coding: utf8 -*-)


    Par contre, si je construis le chemin initial "à la main", je n'ai pas d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    file = Path("G:\\Partagé\\Power BI\\Processing\\CC3\\CC3_for_report.xlsx")
    suffix = "20210509"
     
    try:
        file_extension = PurePath(file).suffix
        file_name = PurePath(file).stem
        file_new_name = Path(PurePath(file).parent, file_name + '_' + suffix + file_extension)
     
        Path(file).rename(file_new_name)

    J'ai essayé plusieurs choses sans succès :
    - rajouter les doubles \\ dans le fichier ini
    - file = Path(r""+config.get('path','target_files_path') , r""+config.get('files','target_file'))

    Est-ce que vous voyez ce que j'ai raté ?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Syagrius Voir le message
    Est-ce que vous voyez ce que j'ai raté ?
    Mon idée c'est que ce que retourne config.get('path','target_files_path') c'est du bytes et non pas du str (une vérification avec print(type(config.get(...))) le confirmera).
    Si c'est ça, il faut alors il faut le transformer en str via decode => file = Path(config.get('path','target_files_path').decode("utf-8") , config.get('files','target_file').decode("utf-8")).

    Citation Envoyé par Syagrius Voir le message
    Je précise que je suis bien en UTF8 (# -*- coding: utf8 -*-)
    Déjà la nouvelle syntaxe c'est # coding: utf-8. Et ça ça veut juste dire que le code source est en utf-8 (les commentaires accentués, etc), pas que ce qui t'arrive depuis une librairie externe est de l'unicode (vérifier aussi d'ailleurs l'encodage du .ini). Et attention de ne pas confondre utf-8 et unicode...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Citation Envoyé par Syagrius Voir le message
    J'ai essayé plusieurs choses sans succès :
    - rajouter les doubles \\ dans le fichier ini
    - file = Path(r""+config.get('path','target_files_path') , r""+config.get('files','target_file'))

    Est-ce que vous voyez ce que j'ai raté ?
    L'histoire de doubler les \ ou d'utiliser des raw string n'a de sens que pour écrire une chaine de caractères littérale dans le code Python. Si la chaine de caractères est lue depuis un fichier texte, c'est inutile.

    Donc si Path(file).rename(file_new_name) dit que le chemin est introuvable, c'est qu'il n'existe pas... reste à valider que la chaine construite avec:
    Path(config.get('path','target_files_path') , config.get('files','target_file')) correspond à un chemin existant.

    Ce qui commence déjà par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    file = Path(config.get('path','target_files_path') , config.get('files','target_file'))
    print('*', bytes(file), '* exists:', file.exists())
    Citation Envoyé par Sve@r Voir le message
    Mon idée c'est que ce que retourne config.get('path','target_files_path') c'est du bytes et non pas du str (une vérification avec print(type(config.get(...))) le confirmera).
    C'est une idée qui se teste facilement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> from pathlib import Path
    >>> Path(b'G:\\zzz', b'aaa')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\py_env\py64_38\lib\pathlib.py", line 1035, in __new__
        self = cls._from_parts(args, init=False)
      File "C:\py_env\py64_38\lib\pathlib.py", line 676, in _from_parts
        drv, root, parts = self._parse_args(args)
      File "C:\py_env\py64_38\lib\pathlib.py", line 665, in _parse_args
        raise TypeError(
    TypeError: argument should be a str object or an os.PathLike object returning str, not <class 'bytes'>
    >>>


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

  4. #4
    Candidat au Club
    Homme Profil pro
    Achats
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Achats

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Sve@r,

    Merci d'avoir pris le temps de répondre.

    Citation Envoyé par Sve@r Voir le message
    (une vérification avec print(type(config.get(...))) le confirmera).
    Ça retourne un type String : <class 'str'>. Ce n'est donc pas ça, mais tu m'as mis sur la piste en indiquant que c'est logiquement le contenu récupéré du fichier .ini qui pose problème. J'ouvrais le fichier ini avec ConfigParser.read()

    [=>Résolution du problème]

    Je suis tombé sur un post ConfigParser with Unicode items. Il apporte la réponse au problème.
    Il indique d'ouvrir le fichier avec ConfigParser.readfp et Codecs. Attention, ConfigParser.readfp() est deprecated. Il faut utiliser ConfigParser.read_file() maintenant.

    Citation Envoyé par Sve@r Voir le message
    la nouvelle syntaxe c'est # coding: utf-8.
    J'en prends note, merci.

    Citation Envoyé par Sve@r Voir le message
    Et attention de ne pas confondre utf-8 et unicode...
    Merci encore.

  5. #5
    Candidat au Club
    Homme Profil pro
    Achats
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Achats

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Citation Envoyé par wiztricks Voir le message
    Salut,
    Donc si Path(file).rename(file_new_name) dit que le chemin est introuvable, c'est qu'il n'existe pas... reste à valider que la chaine construite avec:
    Path(config.get('path','target_files_path') , config.get('files','target_file')) correspond à un chemin existant.
    - W
    J'avais fait un print du résultat, collé dans la barre de navigation de l'Explorer Windows. Le fichier s'ouvre. Je confirme que ce chemin existe.

    Comme indiqué dans mon post précédent, c'était apparemment un problème d'encodage à l'ouverture du fichier .ini. Résolu en ouvrant le fichier avec Codecs.

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

Discussions similaires

  1. shell retourne une erreur
    Par nymus7 dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2008, 18h03
  2. [MySQL] requete qui retourne une erreur a l'execution
    Par naazih dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/05/2008, 12h59
  3. Requete SQL qui retourne une erreur
    Par gregal dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/03/2008, 23h05
  4. Réponses: 8
    Dernier message: 05/02/2008, 11h35
  5. [MSSQL 2005] Retourner une erreure dans une SP
    Par Danny Blue dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/08/2006, 08h19

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