Python - định dạng chuỗi đường dẫn và kiểm tra nếu một đường dẫn tồn tại


8

Tôi muốn sử dụng mã sau đây để xác định xem một đường dẫn có tồn tại không. Đường dẫn tôi muốn kiểm tra đang được chuyển đến mã của tôi thông qua tham số trên hộp thoại công cụ ArcMap 10.0. Kiểu dữ liệu tham số là thư mục, đường dẫn thư mục này đang được chuyển đến sys.argv [2] trong mã của tôi dưới đây.

{import sys

import os

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

    pass

else:

    #Do Something Magical}

Thông thường tôi sẽ không gặp vấn đề gì với tập lệnh này nếu tôi nói rõ đường dẫn thư mục. Ví dụ, bất kỳ một trong ba điều sau đây hoạt động tốt và làm những gì tôi cần:

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

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

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

Trong đoạn mã trước, điều tôi tìm thấy là đường dẫn tức là ( C:\Data\Hardwar\Folder) đang được truyền từ tham số của tôi đến sys.argv [2] chữ cái đầu tiên sau \ đang được thoát và đúng như vậy.
Làm cách nào để định dạng đường dẫn trong sys.argv [2] thành định dạng đường dẫn có thể chấp nhận của python?


2
Là một lưu ý phụ, có một arcpy.exists()lệnh có thể chơi độc đáo hơn với tên tệp và thư mục lẻ hơn os.path.exists.
dmahr

1
Bạn đã thử sử dụng arcpy.GetParameterAsText(1)thay vì sys.argv[2]?
nmpeterson

Tôi không thấy vấn đề bạn mô tả ở 10.0. Bạn có thể đăng ảnh chụp màn hình các thông số công cụ của bạn và những gì bạn đã thấy khiến bạn tin rằng đường dẫn không được giải thích chính xác?
blah238

Câu trả lời:


11

Như bạn đã phát hiện ra, các đường dẫn Windows chứa một dấu gạch chéo ngược đơn, nhưng trong Python, dấu gạch chéo ngược đơn là một ký tự thoát .

Bạn có một vài lựa chọn:

1) Bạn có thể sử dụng một chuỗi thô ( r"stringgoeshere") hoặc os.path.normpath(), như chi tiết trong bài đăng trên blog này .

2) Để Python hiểu rằng một chuỗi chứa một đường dẫn bạn cần sử dụng dấu gạch chéo kép.

Vì vậy, đường dẫn của bạn nên được định dạng như vậy:

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

Một cách khác đơn giản để thực hiện điều này trong mã của bạn sẽ là gán sys.argv[2]cho một chuỗi và định dạng nó từ đó.


-1 vì lời khuyên này chỉ áp dụng cho chuỗi ký tự Python. Các chuỗi được diễn giải từ các đối số dòng lệnh (sys.argv hoặc arpcy.GetParameter (AsText)) đã là các đối tượng chuỗi và vì dấu gạch chéo ngược không phải là ký tự thoát trong shell Windows, bạn không nên thoát dấu gạch chéo ngược ở bất cứ đâu ngoại trừ trong mã nguồn Python (nghĩa là chuỗi ký tự).
blah238

3

Một cái gì đó không bổ sung với câu hỏi hoặc câu trả lời hiện có. Dấu gạch chéo ngược chỉ là ký tự thoát cho chuỗi ký tự trong mã nguồn Python, không phải trên vỏ Windows (đây là những gì Python sử dụng trên Windows để phân tích các đối số dòng lệnh).

Chạy tập lệnh đơn giản này:

import os, sys, arcpy

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

Từ một công cụ tập lệnh ArcGIS 10.0 với một tham số đầu vào thuộc loại Thư mục, kết quả là "Đúng" được in cho bất kỳ thư mục hiện có nào.


Tôi đoán sai lầm lớn nhất của tôi có thể là một khi tham số hộp thoại chuyển giá trị của nó cho sys.argv [2], sau đó tôi chuyển nội dung của sys.argv [2] vào một biến gọi là output_location cho mục đích dễ đọc. Trong đường dẫn đi từ sys.argv [2] đến biến output_location, việc cắt lát có thể xảy ra. Thật không may, tôi không thể kiểm tra lý thuyết này vì hiện tại tôi không có máy. Cảm ơn tất cả các bạn đã phản hồi.
lemuel

Điều đó cũng không giải thích được.
blah238

2

Tôi cảm thấy như bạn có thể quá phức tạp mọi thứ ở đây. Tại sao bạn chiến đấu để vượt qua tham số đầu vào bằng cách sử dụng %sđịnh dạng chuỗi? Hai ví dụ mã làm việc:

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

Hoặc đơn giản:

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

Và @ blah238 là đúng. Nếu bạn đang làm điều này như một Công cụ Hộp công cụ ArcMap, bạn thực sự nên sử dụng arpcy.GetParameter(AsText).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.