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
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
Vous devez vous connecter pour publier un commentaire.
Votre problème est sur cette ligne:
Essayer un de ces:
Ou encore:
(Oui, Windows accepter une barre oblique comme un séparateur de fichiers.)
Ref: http://docs.python.org/2/reference/lexical_analysis.html#string-literals
\a
échapper.Oui, mais le chemin est dans une variable je reçois au moment de l'exécution, et je ne peux pas ajouter un " r " à l'avant d'un nom de variable.
Merci d'éditer votre question d'inclure le code qui initialise cette variable.
Le code qui initialise la variable est la valeur de retour à partir d'une fenêtre du navigateur de fichiers. Je n'ai aucun contrôle sur elle.
Ce graphique trousse à outils utilisez-vous? Pouvez-vous fournir un infiniment petit programme qui utilise la boîte à outils et reproduit l'erreur?
OriginalL'auteur Robᵩ
Ici est une version simplifiée montrant comment "repr" ne fonctionne pas correctement.
Cette affiche:
Comme vous pouvez le voir 'repr' fonctionne avec échappement onglet, évadez-saut de ligne, etc., mais il ne fonctionne pas avec '\a', qui est la fuite de bell.
Est que c'est un bug dans 'repr'?
Est-il intégré dans la solution à ce problème qui ne nécessite pas des programmeurs d'écrire une fonction personnalisée, comme le " reconstruct_broken_string(s)"?
Si non, comment pouvez-python-être cette lame?
file_path = "F:\tab\a_bell\newline.py"
. Cette chaîne littérale a un onglet, une cloche, et un saut de ligne dans. Si vous voulez leur être des barres obliques dans la chaîne, vous devez vous échapper de leur'\\'
ou l'utilisation d'une chaîne bruter'f:\tab ...'
. Mais je soupçonne que ce n'est pas le problème avec votre programme réel, puisque vous l'ai dit d'ailleurs, que vous ne'thave une instruction d'affectation.repr
est dans ce programme fonctionne parfaitement.repr()
retourne une chaîne de caractères qui, si elle est adoptée àeval()
serait de produire de la valeur d'origine.Regarde mon exemple de test ici: chemin_fichier = "F:\tab\a_bell\newline.py" le '\t' dans le tab est traitée correctement par les repr, le '\n' est traitée correctement, mais le '\a' ne fonctionne pas. Pourquoi ne repr pas correcte pour l'ensemble des caractères d'échappement dans une chaîne de caractères?
La sortie de
repr
est correct.\t
est un caractère de tabulation,\n
est un retour à la ligne,\x07
est une alerte de caractère. Mais, pourquoi s'en faire? De quoi êtes-vous à l'aide derepr()
faire? Je peux difficilement imaginer une situation dans laquelle vous pourriez légitimement utiliser la repr() fonction dans votre programme.Si vous regardez au-dessus, j'ai essayé beaucoup de choses pour résoudre le problème de "l'Ouvrir" le traitement de barres obliques inverses dans un chemin comme une évasion. J'ai googlé ce et de nombreuses personnes ont eu le même problème, mais je n'ai pas trouvé un seul 'résolu' en dépit de toutes les personnes qui ont eu des problèmes similaires. Le problème, c'est vraiment très simple: Pourquoi est 'Ouvert' le traitement de barres obliques inverses comme une fuite quand il ne devrait être que de regarder une chaîne passée en tant que chemin d'accès. Il n'est jamais une évasion dans un chemin de! Vous pouvez mettre un " r " pour les matières premières, en face d'une chaîne codée en dur, mais vous ne pouvez pas le faire en face d'une variable pour autant que je sais.
OriginalL'auteur terrachild
Si le chemin d'accès est dans une variable, il suffit de remplacer tous les '\' avec '/' à l'aide de l'un de Python fonctions de manipulation de chaîne. Il devrait résoudre le problème.
Non, il n'est pas.
OriginalL'auteur Hrishi
J'ai connu le même problème exact - essayé chemin = 'C:\temp\importfile.xlsx" et continué à obtenir un message d'erreur "No such file or directory: 'C:\Temp\importdata.xlsx'". J'ai utilisé des barres obliques au lieu et à l'importation travaillé. Avez-vous essayé chemin_fichier = "F:/ScriptsFilePath/addons/import_test.py"?
OriginalL'auteur jenia
Vous pouvez utiliser un r devant une chaîne de sorte que Python gère comme une chaîne brute-
OriginalL'auteur Jasper