[Pour les débutants] Comportement inattendu si "\" est inclus lors de la définition du chemin en Python

introduction

Cet article résume les précautions et les solutions lors du traitement des chaînes de caractères qui incluent une barre oblique inverse "", comme lors de la définition d'un chemin d'accès dans un environnement Windows. (Sur Mac, le délimiteur de chemin est une barre oblique "/", vous n'avez donc pas à vous en soucier lors de la définition du chemin.)

Comportement inattendu si la chaîne contient une barre oblique inverse ""

Par exemple, lorsque vous spécifiez le chemin du dossier dans l'environnement Windows comme indiqué ci-dessous, il peut être traité différemment de la chaîne de caractères attendue.

python


dir_name = 'C:\testDir'
print(dir_name)
#Chaîne de caractères attendue> C:\testDir
#La chaîne de caractères réellement affichée> C:      estDir

La raison pour laquelle cela se produit est que le délimiteur de chemin Windows ** "" barre oblique inverse est ** utilisé en Python pour un processus appelé "séquences d'échappement".

Quel type de traitement est "séquence d'échappement"? Par exemple, lorsque vous souhaitez couper une ligne dans une chaîne de caractères

python


txt = 'Ici pause → ← pause'
# print(txt)Je veux afficher comme suit
#Saut de ligne ici →
#← saut de ligne

Même si vous appuyez sur Entrée simplement parce que vous souhaitez insérer un saut de ligne, un saut de ligne se produira sur le code et une erreur se produira.

python


txt = 'Saut de ligne ici →
← saut de ligne'
# SyntaxError: EOL while scanning string literal

Par conséquent, la méthode pour représenter ** les caractères spéciaux tels que "saut de ligne" est la "séquence d'échappement" **. Le caractère qui signifie un saut de ligne est représenté par "\ n", qui est une combinaison de barres obliques inverses "" \ "" et "n" ".

python


txt = 'Saut de ligne ici →\n ← saut de ligne'
print(txt)
#↓ Chaîne de caractères affichée
#Saut de ligne ici →
#← saut de ligne

Dans l'exemple de définition du premier chemin, la partie \ t de dir_name = 'C: \ testDir' est traitée comme le caractère" TAB". Il a été reconnu comme «C: [TAB] estDir» par Python, et c'était une chaîne de caractères anormalement vide.

approche

Par conséquent, il existe un moyen de traiter "" comme une chaîne de caractères "" barre oblique inverse telle quelle, au lieu de "" pour la séquence d'échappement.

Méthode 1: chaîne brute

Au début de la chaîne, ajoutez l'acronyme «r» pour «raw» qui signifie «tel quel». On l'appelle une chaîne brute et elle sera traitée telle quelle sans séquence d'échappement.

python


#Si r est ajouté, il sera traité tel quel et ne sera pas échappé.
r'C:\testDir'

#Cependant, à la fin, "\Ne peut pas être pris en charge s'il contient ""
r'C:\testDir\'
# SyntaxError: EOL while scanning string literal

Méthode 2: Échapper à la barre oblique inverse ""

Puisque "" est également un caractère spécial, il peut être exprimé par une séquence d'échappement comme "ceci est une barre oblique inverse". Si vous écrivez deux barres obliques inverses "\\", elles seront traitées comme des barres obliques inverses.

python


#Deux barres obliques dans le dos "\\Écrivez pour échapper à la barre oblique inverse elle-même
'C:\\testDir'

Méthode 3: réécrire la barre oblique inverse "" en barre oblique "/"

Je pense que cette méthode est la meilleure pour le chemin. Puisque le caractère de délimitation du chemin de Linux et Mac est une barre oblique "/", vous pouvez éviter les problèmes lorsque vous changez d'environnement si vous êtes conscient de l'unifier avec "/".

Parce que Windows peut également prendre en charge avec la barre oblique "/" Réécrivez la barre oblique inverse «\» par la barre oblique «/» pour y remédier.

python


# 「\"Barre oblique inverse"/Réécrire en barre oblique
'C:/testDir'

point important

Par précaution lors de la réécriture de la barre oblique inverse en une barre oblique Lorsque vous utilisez la fonction pour obtenir le chemin, le délimiteur du chemin est une barre oblique inverse "".

Ce qui suit s'exécute sur "C: \ testDir".

python


import os
#Obtenez le répertoire actuel(Dossier de travail)
current_dir = os.getcwd()
print(current_dir)
# C:\testDir 「\Obtenez avec une barre oblique inverse

Si vous utilisez ce chemin acquis et que vous définissez vous-même les chemins suivants, vous devez faire attention à ne pas mélanger "/" et "".

python


import os
#Obtenez le répertoire actuel
current_dir = os.getcwd()
#Définir un dossier pour les images "/Écrivez le chemin de continuation avec
image_dir = f'{current_dir}/image'
print(image_dir)
# C:\testDir/image 「\」「/"Mixte

La fonction python fonctionne même si elle est mixte, mais lors du passage du chemin vers un autre système ou de la manipulation du chemin sous forme de chaîne, une erreur se produit. Exemple) Lors de la configuration du dossier de téléchargement de Chrome dans Selenium

Par conséquent, comme solution de contournement, remplacez "" par "/" lors de l'obtention du chemin d'accès, puis récupérez-le.

python


import os
#Lors de l'obtention du répertoire actuel, définissez le délimiteur sur "/Remplacé par
current_dir = os.getcwd().replace(os.sep,'/')
print(current_dir)
# C:/testDir

en conclusion

Merci pour votre visite. Il existe différentes manières de gérer la barre oblique inverse "", mais définissons des règles sur site ou par nous-mêmes et unissons-les pour que nous puissions développer sans problème.

référence

Utiliser la séquence d'échappement Chaîne brute qui ignore (désactive) les séquences d'échappement en Python Get Separator

Recommended Posts

[Pour les débutants] Comportement inattendu si "\" est inclus lors de la définition du chemin en Python
Vérifiez si la chaîne est un nombre en python
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin
Vérifiez le comportement lors de l'attribution de Python
Comportement lors de la liste dans Python heapq
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Obtenez le chemin du bureau en Python
À quoi sert le trait de soulignement Python (_)?
Exécutez unittest en Python (pour les débutants)
Comportement lorsque 0, 1, False, True est utilisé pour la clé dict
[Golang] Vérifiez si une chaîne de caractères spécifique est incluse dans la chaîne de caractères
Que faire lorsque le type de valeur est ambigu en Python?
Vérifiez le comportement du destroyer en Python
Comportement lors du retour dans le bloc with
Inject est recommandé pour DDD en Python
[python, multitraitement] Comportement des exceptions lors de l'utilisation du multitraitement
[Exemple d'amélioration de Python] Quel est le site d'apprentissage recommandé pour les débutants en Python?
Vérifiez si l'URL existe en Python
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Lorsque la cible est Ubuntu 16.04 dans Ansible
MongoDB avec Python pour la première fois
Notifier à l'aide du Centre de notifications lorsque l'environnement d'exécution est macOS en Python
Une note utile lors de l'utilisation de Python après une longue période
Même si le langage de développement est changé en python3 dans Cloud9, la version 2 est affichée en python --version
Notifier à l'aide du Centre de notifications lorsque l'environnement d'exécution est macOS en Python
Différences de comportement de chaque langage LL lorsque l'index de la liste est ignoré
CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS
Le moyen le plus rapide pour les débutants de maîtriser Python
Vérifiez si les caractères sont similaires en Python
Qu'est-ce que wheezy dans l'image Docker Python?
À propos de la différence entre "==" et "is" en python
Conseils pour accéder à l'API ATND avec Python
Essayez de calculer RPN avec Python (pour les débutants)
Comportement lors de l'enregistrement d'un objet datetime python dans MongoDB
[Introduction pour les débutants] Manipuler MySQL avec Python
Histoire de base de l'héritage en Python (pour les débutants)
Bibliothèques à inclure lors de la création d'API dans l'environnement Django Rest Frakework, extensions vscode, etc. (pour les débutants)
Python --Si le comportement de jugement de l'instruction dans plusieurs conditions (même si l'ordre est différent)
Importez audit.log dans Splunk et vérifiez le comportement lorsque Splunk est démarré pour la première fois.
Que faire si la barre de progression n'est pas affichée dans tqdm de python
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
Points à garder à l'esprit lors de la création d'outils automatisés pour l'atelier en Python
[Python] Précautions quand cela ne fonctionne pas même si TimedRotatingFileHandler est défini dans basicConfig en python2
[Introduction à Python] Quel est l'important "if __name__ == '__ main__':" lorsqu'il s'agit de modules?
python> Vérifier si le code est imprimable> Utiliser ord () / all (c dans string.printable for c in hello)
Janken Poi en Python pour les débutants (réponses et explications)
[Pour les débutants] Comment utiliser la commande say avec python!
Vérifiez s'il s'agit d'Unix dans le langage de script
Trouvez la partie 575 de Wikipedia en Python
Incorporation dans datetime lorsque seule l'heure est connue
Electron est la meilleure solution pour le développement multi-plateforme de Python
Déterminer si un attribut est défini dans l'objet
Exercice Python pour les débutants # 1 [Types de données de base / instructions If]
[Pour les débutants] Apprenez la grammaire de base Python gratuitement en 5 heures!
Vérifiez s'il s'agit d'Unix dans le langage de script
Pour ceux qui ont des problèmes car NFC est lu à l'infini lors de la lecture de NFC avec Python
Que faire s'il n'y a pas de réponse en raison des paramètres de proxy dans le scraping Web Python
Ce qui est plus rapide à utiliser l'instruction if ou le type de dictionnaire lors de la conversion d'une chaîne (a-> b) en Python