Python - formatage des chaînes de chemin et vérification de l'existence d'un chemin

8

Je voudrais utiliser le code suivant pour déterminer si un chemin existe. Le chemin que je voudrais vérifier est transmis à mon code via un paramètre dans une boîte de dialogue d'outil ArcMap 10.0. Le type de données des paramètres est dossier, ce chemin de dossier est transmis à sys.argv [2] dans mon code ci-dessous.

{import sys

import os

if os.path.exists("%s"): %(sys.argv[2])

    pass

else:

    #Do Something Magical}

Normalement, je n'aurais aucun problème avec ce script si j'indiquais explicitement le chemin du dossier. Par exemple, l'un des trois suivants fonctionne bien et fait ce dont j'ai besoin:

os.path.exists("C:\\Data\\Hardwar\\Folder"):

os.path.exists(r"C:\Data\Hardwar\Folder"):

os.path.exists("C:/Data/Hardwar/Folder"):

Dans le code précédent, ce que je trouve, c'est que lorsque le chemin ie ( C:\Data\Hardwar\Folder) est passé de mon paramètre à sys.argv [2], la première lettre après \ est échappée et à juste titre.
Comment formater le chemin d'accès dans sys.argv [2] vers un format de chemin d'accès python acceptable?

lemuel
la source
2
En remarque, il existe une arcpy.exists()commande qui peut jouer plus bien avec des noms de fichiers et de dossiers impairs que os.path.exists.
dmahr
1
Avez-vous essayé d'utiliser arcpy.GetParameterAsText(1)au lieu de sys.argv[2]?
nmpeterson
Je ne vois pas le problème que vous décrivez à 10.0. Pouvez-vous publier des captures d'écran des paramètres de votre outil et ce que vous avez vu qui vous a amené à croire que le chemin n'est pas interprété correctement?
blah238

Réponses:

11

Comme vous l'avez découvert, les chemins d'accès Windows contiennent une seule barre oblique inverse, mais en Python, une seule barre oblique inverse est un caractère d'échappement .

Vous avez quelques options:

1) Vous pouvez utiliser une chaîne brute ( r"stringgoeshere") ou os.path.normpath(), comme détaillé dans cet article de blog .

2) Pour que Python comprenne qu'une chaîne contient un chemin, vous devez utiliser des barres obliques inverses doubles.

Votre chemin doit donc être formaté comme tel:

(C:\\Data\\Hardware\\Folder)

Une autre façon simple d'accomplir cela dans votre code serait d'attribuer sys.argv[2]à une chaîne et de la formater à partir de là.

Radar
la source
-1 car ce conseil ne s'applique qu'aux littéraux de chaîne Python. Les chaînes interprétées à partir des arguments de ligne de commande (sys.argv ou arpcy.GetParameter (AsText)) sont déjà des objets chaîne et comme une barre oblique inversée n'est pas un caractère d'échappement dans le shell Windows, vous ne devez pas échapper les barres obliques inverses ailleurs sauf dans le code source Python (c'est-à-dire littéraux de chaîne).
blah238
3

Quelque chose ne correspond ni à la question ni aux réponses existantes. La barre oblique inverse est uniquement un caractère d'échappement pour les littéraux de chaîne dans le code source Python, pas sur le shell Windows (qui est ce que Python utilise sous Windows pour analyser les arguments de la ligne de commande).

Exécution de ce script simple:

import os, sys, arcpy

arcpy.AddMessage(str(os.path.exists(sys.argv[1])))

À partir d'un outil de script ArcGIS 10.0 avec un seul paramètre d'entrée de type Dossier, "True" est imprimé pour tout dossier existant.

blah238
la source
Je suppose que ma plus grande erreur a pu être qu'une fois le paramètre de boîte de dialogue passé sa valeur à sys.argv [2], j'ai ensuite passé le contenu de sys.argv [2] dans une variable appelée output_location à des fins de lisibilité. En passant le chemin de sys.argv [2] à la variable output_location, le découpage peut avoir eu lieu. Malheureusement, je ne suis pas en mesure de tester cette théorie car je ne suis pas actuellement sur ma machine. Merci à tous pour les commentaires.
lemuel
Cela ne l'expliquerait pas non plus.
blah238
2

J'ai l'impression que vous compliquez peut-être trop les choses ici. Pourquoi vous battez-vous pour passer le paramètre d'entrée en utilisant le %sformatage des chaînes? Deux exemples de code de travail:

import sys,os

#set the input parameter as a variable
var = sys.argv[1]

if os.path.exists(var):
    print "exists"

else:
    print "fails"
    #Do Something Magical

Ou simplement:

import sys,os

#Just pass the input parameter directly to the exists function
if os.path.exists(sys.argv[1]):
    print "exists"

else:
    print "fails"
    #Do Something Magical

Et @ blah238 a raison. Si vous faites cela en tant qu'outil ArcMap Toolbox, vous devriez vraiment l'utiliser arpcy.GetParameter(AsText).

RyanKDalton
la source