Python-パス文字列のフォーマットとパスが存在するかどうかの確認


8

次のコードを使用して、パスが存在するかどうかを確認したいと思います。チェックしたいパスが、ArcMap 10.0ツールダイアログボックスのパラメーターを介してコードに渡されています。パラメータのデータタイプはフォルダです。このフォルダパスは、以下のコードでsys.argv [2]に渡されます。

{import sys

import os

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

    pass

else:

    #Do Something Magical}

通常、フォルダーパスを明示的に指定していれば、このスクリプトで問題は発生しません。たとえば、次の3つのいずれもうまく機能し、私が必要とすることを行います。

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

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

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

上記のコードで私が見つけているのは、パス((C:\Data\Hardwar\Folder)がパラメーターからsys.argv [2]に渡されるときに、\の後の最初の文字がエスケープされ、正しくエスケープされていることです。
sys.argv [2]のパスをPythonの許容パス形式にフォーマットするにはどうすればよいですか?


2
補足として、arcpy.exists()奇妙なファイル名やフォルダ名を使用する場合よりもうまく再生できるコマンドがありますos.path.exists
dmahr 2013年

1
arcpy.GetParameterAsText(1)代わりに使用してみましたsys.argv[2]か?
nmpeterson 2013年

私はあなたが10.0で説明する問題を見ていません。ツールのパラメーターのスクリーンショットを投稿できますか。また、パスが正しく解釈されていないと思われるようになったのは何ですか。
blah238 2013年

回答:


11

ご存知のとおり、Windowsパスには単一のバックスラッシュが含まれていますが、Pythonでは単一のバックスラッシュがエスケープ文字です。

いくつかのオプションがあります。

1)このブログ投稿で説明されているように、生の文字列r"stringgoeshere")またはを使用できます。os.path.normpath()

2) Pythonが文字列にパスが含まれていることを理解するには、二重のバックスラッシュを使用する必要があります。

したがって、パスは次のようにフォーマットする必要があります。

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

コードでこれを実現する簡単な代替方法はsys.argv[2]、文字列に割り当て、そこからフォーマットすることです。


-1このアドバイスはPython文字列リテラルにのみ適用されるため。コマンドライン引数(sys.argvまたはarpcy.GetParameter(AsText))から解釈された文字列は既に文字列オブジェクトであり、円記号はWindowsシェルではエスケープ文字ではないため、Pythonソースコード(つまり、文字列リテラル)。
blah238 2013年

3

質問または既存の回答のいずれかが足りない。バックスラッシュは、Pythonのソースコード内の文字列リテラルのエスケープ文字にすぎず、Windowsシェル(PythonがWindowsでコマンドライン引数を解析するために使用するもの)では使用できません。

次の簡単なスクリプトを実行します。

import os, sys, arcpy

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

フォルダータイプの単一の入力パラメーターを持つArcGIS 10.0スクリプトツールから、既存のフォルダーに対して「True」が出力されます。


私の最大の間違いは、ダイアログボックスのパラメーターがその値をsys.argv [2]に渡した後、sys.argv [2]の内容を読みやすくするためにoutput_locationと呼ばれる変数に渡したことだったと思います。sys.argv [2]から変数output_locationにパスを渡す際に、スライスが行われた可能性があります。残念ながら、私は現在自分のマシンにいないので、この理論をテストすることはできません。フィードバックありがとうございます。
lemuel 2013年

それもそれを説明しないでしょう。
blah238 2013年

2

ここでは、複雑すぎます。%s文字列フォーマットを使用して入力パラメーターを渡すために戦うのはなぜですか?2つの実際のコード例:

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

または単に:

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

そして@ blah238は正しいです。これをArcMapツールボックスツールとして実行する場合は、実際にを使用する必要がありますarpcy.GetParameter(AsText)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.