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 :

Problème de guillemet dans un nom de fichier


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut Problème de guillemet dans un nom de fichier
    Bonjour et bon dimanche,

    je rencontre un problème dans un soft que je développe.

    Le principe est de choisir un fichier et de lancer un commande de type QProcess (pareil avec un SubProcess).

    Voici le petit code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.process.start('env LANGUAGE=en mkvinfo "{}" '.format(File))
    Ca fonctionne très bien avec tous les caractères sauf 1, les guillemets ". Si File en contient un, le process ne fonctionne plus.
    J'ai voulu faire un replace('"', '\"') mais pas de changement...
    Idem en essayant de jouer avec """ ou ''' mais rien n'y fait...

    L'adresse qui en ressort n'est pas bonne puisqu'un " se ballade dedans, de ce fait, bash est paumé et n'arrive pas à lancer la commande...

    Avez vous une solution simple pour régler ce problème ?

    Merci à vous et bonne fin de week end.
    Sous Kubuntu 20.04

  2. #2
    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 hizoka,

    Je n'ai pas le problème, puisque le guillemet est interdit dans les noms de fichier sous Windows (comme: \ / : * ? < > | ), et je ne suis pas sûr que ce soit une bonne idée dans les autres OS, ne serait-ce que pour permettre les partages...

    Essaie tout de même de doubler le guillemet?
    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

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Une mauvaise idée oui, mais pas interdit sous linux.
    commande '/home/hizoka/"oui".txt' fonctionne tres bien :p

    Un double guillemet dans le nom du fichier ?
    Si c'est ça, j'ai déjà tester :p
    Sous Kubuntu 20.04

  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
    Attention: il ne s'agit pas de renommer le fichier mais de modifier son appel.

    Je viens de faire un petit essai sur mon Linux (Mint v17.3 bureau Cinnamon):

    Soit un fichier qui s'appelle: toto"tata.txt (quelle imagination...)

    Dans une console, j'appelle (gedit est l'éditeur de texte):

    ça ne marche pas: l'éditeur ouvre le fichier tototata.txt, donc un autre.

    J'appelle ensuite:

    Là, ça marche! l'éditeur appelle bien le fichier toto"tata.txt, permet de le modifier, etc...

    Ok?
    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 éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Si tu veux obtenir un antislash dans une chaîne tu dois l'échapper (donc le doubler).
    Essaie: self.process.start('env LANGUAGE=en mkvinfo "{}" '.format(File.replace('"', '\\"')).

    Tu devrais obtenir une chaîne avec un antislash (littéral) qui une fois passé au sous-shell sera vu comme le caractère d'échappement.

    À ta place je n'utiliserai pas les doubles quotes dans le shell car certains éléments d'une chaîne entre doubles quotes peuvent être interprétés. Par exemple si tu as un nom de fichier comportant un $, celui-ci sera vu comme le début d'un nom de variable. Il serait plus sûr d'utiliser des simples quotes:

    self.process.start('env LANGUAGE=en mkvinfo \'{}\' '.format(File.replace("'", "\\'"))
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    tout a fait il faut l'échapper sauf que j'obtiens :
    \\" et non \" en utilisant replace('"', '\\"'), j'étais parti là dessus directement mais impossible à faire fonctionner...
    c'est pour ça que je demande conseil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a='fichier "bidon".mkv'
    >>> a.replace('"', '\"')
    'fichier "bidon".mkv'
    >>> a.replace('"', '\\"')
    'fichier \\"bidon\\".mkv'
    Sous Kubuntu 20.04

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je pense que tu fais une confusion entre la représentation de la chaîne dans la console python, qui affiche l'antislash littéral de la même manière que quand tu l'a saisi (en l'échappant donc), et la réalité de cette chaîne. Pour t'en convaincre, essaie: print(a.replace('"', '\\"')).

    Quant à la disparition de l'antislash quand tu écris: a.replace('"', '\"') elle est normale puisque les échappements inutiles sont ignorés.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Bien vu, en effet, je me suis fait avoir mais j'avais déjà testé dans mon soft :
    je pige pas, à chaque fois il dégage les ", je suis bien paumé...

    Du coup je me mets à tester tout et n'importe quoi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    a='/home/hizoka/"a".mkv'
    'env LANGUAGE=en mkvinfo "{}" '.format(File.replace('"', '\\"'))
    'env LANGUAGE=en mkvinfo \'{}\' '.format(File.replace("'", "\\'"))
     '''env LANGUAGE=en mkvinfo '{}' '''.format(File.replace('"', '\\"'))
    '''env LANGUAGE=en mkvinfo "{}" '''.format(File.replace('"', '\\"')
    """env LANGUAGE=en mkvinfo "{}" """.format(File.replace('"', '\\"')
     
    Error: The file '/home/hizoka/a.mkv' could not be opened for reading: open file error.
    Sous Kubuntu 20.04

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne sais pas d'où sort self.process.start et les arguments que ça supporte, mais si c'est comme subprocess.call, tu peux tenter de lui passer une liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.process.start(['env', 'LANGUAGE=en', 'mkvinfo', File])
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    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
    Essayez avec 'env LANGUAGE=en mkvinfo "{}" '.format(File.replace('"', r'\"'))

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/01/2012, 15h43
  2. Incrémenter un n° dans un nom de fichier
    Par pandore dans le forum Fortran
    Réponses: 6
    Dernier message: 03/05/2006, 11h30
  3. [DOM] Problème d'accent sur les noms de fichier avec mon parseur
    Par ujoodha dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/04/2006, 21h55
  4. Réponses: 17
    Dernier message: 12/04/2005, 15h28
  5. problème de guillemets dans une formule shell
    Par dim_italia dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/08/2003, 12h46

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