Python - formatando cadeias de caminhos e verificando se existe um caminho

8

Eu gostaria de usar o código a seguir para determinar se existe um caminho. O caminho que gostaria de verificar está sendo passado para o meu código via parâmetro em uma caixa de diálogo da ferramenta ArcMap 10.0. O tipo de dado dos parâmetros é folder, esse caminho da pasta está sendo passado para sys.argv [2] no meu código abaixo.

{import sys

import os

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

    pass

else:

    #Do Something Magical}

Normalmente, eu não teria nenhum problema com esse script se estivesse declarando explicitamente o caminho da pasta. Por exemplo, qualquer um dos três seguintes funciona bem e faz o que eu preciso:

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

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

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

No código anterior, o que estou descobrindo é que, como o caminho ie ( C:\Data\Hardwar\Folder) está sendo passado do meu parâmetro para sys.argv [2], a primeira letra após \ está sendo escapada e com razão.
Como formatar o caminho em sys.argv [2] para um formato de caminho aceitável em python?

lemuel
fonte
2
Como uma observação lateral, há um arcpy.exists()comando que pode ser mais bem reproduzido com nomes de arquivos e pastas ímpares que os.path.exists.
dmahr
1
Você já tentou usar em arcpy.GetParameterAsText(1)vez de sys.argv[2]?
Npmeterson
Não estou vendo o problema descrito em 10.0. Você pode publicar capturas de tela dos parâmetros da ferramenta e o que viu que o levou a acreditar que o caminho não está sendo interpretado corretamente?
blah238

Respostas:

11

Como você descobriu, os caminhos do Windows contêm uma única barra invertida, mas no Python uma única barra invertida é um caractere de escape .

Você tem poucas opções:

1) Você pode usar uma string não processada ( r"stringgoeshere") ou os.path.normpath(), conforme detalhado nesta postagem do blog .

2) Para que o Python entenda que uma string contém um caminho, você precisa usar barras invertidas duplas.

Portanto, seu caminho deve ser formatado da seguinte maneira:

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

Uma maneira alternativa simples de fazer isso no seu código seria atribuir sys.argv[2]a uma string e formatá-la a partir daí.

Radar
fonte
-1 porque esse conselho se aplica apenas aos literais de string do Python. Seqüências de caracteres interpretadas a partir dos argumentos da linha de comando (sys.argv ou arpcy.GetParameter (AsText)) já são objetos de seqüência de caracteres e, como uma barra invertida não é um caractere de escape no shell do Windows, você não deve escapar das barras invertidas em qualquer lugar, exceto no código-fonte Python (ou seja, literais de string).
blah238
3

Algo não corresponde à pergunta ou às respostas existentes. A barra invertida é apenas um caractere de escape para literais de string no código-fonte do Python, não no shell do Windows (que é o que o Python usa no Windows para analisar os argumentos da linha de comando).

Executando este script simples:

import os, sys, arcpy

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

Em uma ferramenta de script do ArcGIS 10.0 com um único parâmetro de entrada do tipo Pasta, resulta em "True" sendo impresso para qualquer pasta existente.

blah238
fonte
Acho que meu maior erro pode ter sido que, uma vez que o parâmetro da caixa de diálogo passou seu valor para sys.argv [2], passei o conteúdo de sys.argv [2] para uma variável chamada output_location para fins de legibilidade. No caminho de passagem de sys.argv [2] para a variável output_location, o fatiamento pode ter ocorrido. Infelizmente, não sou capaz de testar essa teoria, pois atualmente não estou na minha máquina. Obrigado a todos pelo feedback.
Lemuel
Isso também não explicaria.
blah238
2

Eu sinto que você pode estar complicando demais as coisas aqui. Por que você está lutando para passar o parâmetro de entrada usando a %sformatação de string? Dois exemplos de código de trabalho:

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 simplesmente:

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

E @ blah238 está certo. Se você estiver fazendo isso como uma ferramenta ArcMap Toolbox, você realmente deve estar usando arpcy.GetParameter(AsText).

RyanKDalton
fonte