Python - memformat string path dan memeriksa apakah ada path

8

Saya ingin menggunakan kode berikut untuk menentukan apakah ada jalan. Jalur yang ingin saya periksa sedang diteruskan ke kode saya melalui parameter pada kotak dialog alat ArcMap 10.0. Tipe data parameter adalah folder, jalur folder ini diteruskan ke sys.argv [2] dalam kode saya di bawah ini.

{import sys

import os

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

    pass

else:

    #Do Something Magical}

Biasanya saya tidak akan memiliki masalah dengan skrip ini jika saya secara eksplisit menyatakan path folder. Misalnya salah satu dari tiga berikut ini berfungsi dengan baik dan melakukan apa yang saya butuhkan:

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

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

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

Dalam kode sebelumnya apa yang saya temukan adalah bahwa sebagai path yaitu ( C:\Data\Hardwar\Folder) sedang diteruskan dari parameter saya ke sys.argv [2] huruf pertama setelah \ sedang melarikan diri dan memang seharusnya begitu.
Bagaimana cara memformat path di sys.argv [2] ke format path yang dapat diterima python?

lemuel
sumber
2
Sebagai catatan, ada arcpy.exists()perintah yang mungkin bisa bermain lebih baik dengan nama file dan folder aneh daripada os.path.exists.
dmahr
1
Apakah Anda mencoba menggunakan arcpy.GetParameterAsText(1)bukan sys.argv[2]?
nmpeterson
Saya tidak melihat masalah yang Anda gambarkan pada 10.0. Bisakah Anda memposting tangkapan layar dari parameter alat Anda dan apa yang Anda lihat yang membuat Anda percaya bahwa jalan tidak ditafsirkan dengan benar?
blah238

Jawaban:

11

Seperti yang telah Anda temukan, jalur Windows berisi backslash tunggal, tetapi dalam Python backslash tunggal adalah karakter pelarian .

Anda punya beberapa pilihan:

1) Anda dapat menggunakan string mentah ( r"stringgoeshere"), atau os.path.normpath(), sebagaimana dirinci dalam posting blog ini .

2) Agar Python memahami bahwa string berisi jalur, Anda perlu menggunakan garis miring terbalik ganda.

Jadi jalur Anda harus diformat seperti itu:

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

Cara alternatif sederhana untuk mencapai ini dalam kode Anda adalah dengan menetapkan sys.argv[2]ke string dan memformatnya dari sana.

Radar
sumber
-1 karena saran ini hanya berlaku untuk string string Python. String yang ditafsirkan dari argumen baris perintah (sys.argv atau arpcy.GetParameter (AsText)) sudah menjadi objek string dan karena garis miring terbalik bukanlah karakter pelarian dalam shell Windows, Anda tidak boleh melarikan diri garis miring terbalik di mana pun kecuali dalam kode sumber Python (yaitu string literal).
blah238
3

Sesuatu tidak cocok dengan pertanyaan atau jawaban yang ada. Backslash hanya karakter pelarian untuk string literal dalam kode sumber Python, bukan pada shell Windows (yang digunakan Python pada Windows untuk mengurai argumen baris perintah).

Menjalankan skrip sederhana ini:

import os, sys, arcpy

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

Dari alat skrip ArcGIS 10.0 dengan parameter input tunggal dari tipe Folder, menghasilkan "True" yang dicetak untuk folder yang ada.

blah238
sumber
Saya kira kesalahan terbesar saya mungkin sekali parameter kotak dialog melewati nilainya ke sys.argv [2], saya kemudian meneruskan konten sys.argv [2] ke dalam variabel yang disebut output_location untuk tujuan keterbacaan. Dalam melewati path dari sys.argv [2] ke variabel output_location, slicing mungkin telah terjadi. Sayangnya saya tidak dapat menguji teori ini karena saya saat ini tidak di mesin saya. Terima kasih atas umpan baliknya.
lemuel
Itu juga tidak akan menjelaskannya.
blah238
2

Saya merasa Anda mungkin terlalu rumit di sini. Mengapa Anda berjuang untuk melewati parameter input menggunakan %spemformatan string? Dua contoh kode kerja:

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

Atau sederhananya:

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

Dan @ blah238 benar. Jika Anda melakukan ini sebagai Alat ArcMap Toolbox, Anda harus benar-benar menggunakannya arpcy.GetParameter(AsText).

RyanKDalton
sumber