Python caractère d'échappement

J'ai lutté pendant des heures avec ce et même si j'ai trouvé une solution, je ne l'aime pas.
Est-il intégré dans la façon de résoudre ce problème:

Vous êtes sur Windows avec une variable qui contient un chemin d'accès.
Vous tentez d'ouvrir un fichier avec elle, mais il contient des caractères d'échappement que vous ne pouvez pas déterminer jusqu'à ce que l'exécution.

Si vous utilisez la "shutil" et faire:
shutil.copy(file_path, new_file_path)

Il fonctionne très bien.

Mais si vous essayez d'utiliser le même chemin avec:

f = open(file_path, encoding="utf8")

Cela ne fonctionne pas car le '\' dans le chemin d'accès est lu comme un 'Bell' = 7

J'ai essayé de faire toutes ces, mais la seule chose que j'ai appris à travailler est la fonction personnalisée 'reconstruct_broken_string'.

    file_path = "F:\ScriptsFilePath\addons\import_test.py"

    print(sys.getdefaultencoding())
    print()
    print(file_path.replace('\\', r'\\'))
    print( '%r' % (file_path))
    print( r'r"' + "'" + file_path+ "'")
    print(file_path.encode('unicode-escape'))
    print(os.path.normpath(file_path))
    print(repr(file_path))

    print()
    print(reconstruct_broken_string(file_path))


backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f',
                  '\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' }
def reconstruct_broken_string(s):
    for key, value in backslash_map.items():
        s = s.replace(key, value)
    return s

Ici est l'impression:

utf-8

F:\\ScriptsFilePathddons\\import_test.py
'F:\\ScriptsFilePath\x07ddons\\import_test.py'
r"'F:\ScriptsFilePathddons\import_test.py'
b'F:\\\\ScriptsFilePath\\x07ddons\\\\import_test.py'
F:\ScriptsFilePathddons\import_test.py
'F:\\ScriptsFilePath\x07ddons\\import_test.py'

F:\ScriptsFilePath\addons\import_test.py

Est-il intégré dans la manière de faire ceci plutôt que cela?
Pourquoi faut-il travailler avec 'shutil" et non "ouvrir"

Grâce

Veuillez réduire votre programme pour le plus petit programme qui montre l'erreur. Puis copier-coller de ce programme court à votre question. Voir SSCCE.ORG pour plus d'informations sur cette débogage technique.
Vous pouvez simplifier la reconstruct_broken_string à l'aide d'un unique appel à str.translate(si vous êtes sur python3). Il suffit de modifier le backslash_map de sorte que les touches sont les * * * le code-points*(c'est à dire ord('\a'): r'\a') et d'appeler file_path.translate(backslash_map).
J'ai essayé en vain: backslash_map = {ord ('\') : r'\a'} alors: file_path.traduire(backslash_map)
Essayons ceci à partir d'un autre angle. Vous dites que open() "ne fonctionne pas." Pouvez-vous développer? Ce n' open() retour? Améliore-t-il une exception? Si oui, pouvez-vous copier-coller le précise message d'erreur?
'Open' ne peut pas trouver le fichier parce que le '\' dans le chemin d'accès est traité comme un caractère d'échappement (bell, qui est de 7). Pourquoi est 'Ouvert' même à la recherche pour les caractères d'échappement dans un chemin passé. Le même chemin dans une variable passée à "Shutil" pour copier le fichier fonctionne très bien. 'Shutil' est assez intelligent pour ne pas chercher les caractères d'échappement dans un chemin, pourquoi ne pas "Ouvrir" assez intelligents pour le faire?

OriginalL'auteur terrachild | 2013-09-08