کاوش در داده های مکانی -فصل 6
6.1معرفی
این فصل چندین رویکرد را برای کاوش دادههای مکانی، از جمله بررسی وجود مجموعههای داده، توصیف مجموعههای داده، و فهرست کردن مجموعههای داده در یک فضای کاری توصیف میکند. توابع لیست نه تنها برای فهرست کردن مجموعه دادهها، بلکه برای فهرست کردن عناصری مانند فضاهای کاری، فیلدها و جداول نیز استفاده میشوند. از توابع داخلی پایتون می توان برای دستکاری لیست ها استفاده کرد. فهرستها در اسکریپتها رایج هستند، زیرا امکان تکرار روی عناصر را برای خودکارسازی گردشهای کاری فراهم میکنند.
6.2بررسی وجود داده ها
برای کار با ابزارهای geoprocessing در ArcGIS Pro، معمولاً مجموعه دادههای ورودی را در کادر محاورهای ابزار با انتخاب از فهرستی از لایههای داده موجود یا با مرور به مجموعه داده صحیح مشخص میکنید. جعبه های محاوره ای ابزار دارای مکانیسم های داخلی برای تأیید پارامترهای ابزار هستند. به عنوان مثال، اگر نام مجموعه دادهای را وارد کنید که وجود ندارد، یک پیام خطا به طور خودکار در کنار پارامتر در کادر محاورهای ابزار ظاهر میشود و از اجرای ابزار جلوگیری میکند. با این حال، در اسکریپت های پایتون، ممکن است لازم باشد تعیین کنید که آیا مجموعه داده ها در واقع وجود دارند یا خیر. این کار را می توان با استفاده ازarcpy.Exists()عملکرد. این تابع یک مقدار بولی ازدرست است، واقعییانادرست، نشان می دهد که آیا عنصر وجود دارد یا خیر. دروجود دارد()تابع وجود کلاس های ویژگی، جداول، مجموعه داده ها، فضاهای کاری، لایه ها و فایل های دیگر را تعیین می کند.
نحو ازوجود دارد()تابع است
arcpy.Exists(<dataset>)
به عنوان مثال، کد زیر تعیین می کند که آیا یک شکل فایل وجود دارد یا خیر:
واردات کمان
print(arcpy.Exists(“C:/Data/streams.shp”))
مقدار برگشتی (درست است، واقعییانادرست) روی صفحه چاپ می شود.
هنگام کار با پایتون، باید دو نوع مسیر را در نظر داشته باشید:
- مسیرهای سیستم– اینها مسیرهایی هستند که توسط سیستم عامل ویندوز شناسایی شده است.
- مسیرهای کاتالوگ– اینها مسیرهایی هستند که فقط ArcGIS Pro آنها را تشخیص می دهد.
به عنوان مثال، C:\Data و C:\Data\streams.shp مسیرهای سیستمی هستند که توسط سیستم عامل ویندوز و بنابراین توسط پایتون شناسایی می شوند. از سوی دیگر، C:\Data \study.gdb\final\streets یک مسیر کاتالوگ است که در ArcGIS Pro استفاده می شود. در این مثال، study.gdb یک پایگاه جغرافیایی فایل، final یک مجموعه داده ویژگی، و streets یک کلاس ویژگی است. چنین مسیرهای کاتالوگ توسط ArcGIS Pro تشخیص داده می شوند، اما نه توسط سیستم عامل ویندوز یا پایتون. وجود یک مسیر سیستم را می توان با استفاده از پایتون تعیین کردos.path.exists(). با این حال، این توابع با مسیرهای کاتالوگ کار نمی کنند. برای کار با مسیرهای کاتالوگ در پایتون، باید از توابع ArcPy مانندوجود دارد().
چند یادداشت دیگر به مسیرهای کاتالوگ و انواع پایگاه های جغرافیایی مربوط می شود. یک پایگاه جغرافیایی فایل به عنوان “.gdb” نامیده می شود – برای مثال، study.gdb. یک پایگاه جغرافیایی سازمانی به عنوان “.sde” نامیده می شود – برای مثال، study.sde.
توجه داشته باشید:استفاده از پایگاه های جغرافیایی شخصی (پسوند فایل .mdb) دیگر در ArcGIS Pro پشتیبانی نمی شود. اگر فایلهای mdb. قدیمیتری دارید، باید از یک برنامه ArcGIS Desktop 10.x مانند ArcMap استفاده کنید.™یا ArcCatalog™قبل از اینکه بتوانید از آنها در ArcGIS Pro استفاده کنید، آنها را به یک پایگاه داده جغرافیایی (gdb.) تبدیل کنید.
مسیرهای کاتالوگ از دو بخش تشکیل شده است: فضای کاری و نام پایه. در مثال قبل، C:\Data\study.gdb\final فضای کاری و streets نام پایه است. مسیرهای سیستم همچنین حاوی یک نام پایه هستند که آخرین قسمت مسیر است که دارای اسلش نیست. به عنوان مثال، در C:\Data\streams.shp، نام پایه streams.shp است. شناسایی نام پایه برای مدیریت مجموعه داده ها، مانند تبدیل آنها به فرمت های متفاوت، مهم است.
کار با عناصر داخل یک پایگاه داده جغرافیایی چالش هایی را به همراه دارد. به عنوان مثال، ArcPy چگونه رشته ای مانند C:\Data\study.gdb\final را تفسیر می کند؟ آیا “نهایی” به عنوان یک کلاس ویژگی، یک مجموعه داده ویژگی، یک رستر یا یک جدول تفسیر می شود؟ تفسیر به زمینه خاص است. به عنوان مثال، اگر از رشته برای تنظیم فضای کاری فعلی استفاده شود، “نهایی” به عنوان نام مجموعه داده ویژگی در نظر گرفته می شود، اما اگر رشته برای تعیین یک کلاس ویژگی خروجی استفاده شود، “نهایی” به عنوان نام کلاس ویژگی در نظر گرفته می شود. . بخش بعدی نحوه تعیین نوع عنصر مورد استفاده را توضیح می دهد که حدس زدن را از تفسیر مسیرهای فهرست حذف می کند.
6.3توصیف داده ها
ابزارهای ژئوپردازش با انواع داده های مکانی کار می کنند. هر نوع داده دارای ویژگی هایی است که جریان یک اسکریپت را کنترل می کند. توابع ArcPy می توانند ویژگی های کلاس ویژگی ورودی را برای یک ابزار پردازش جغرافیایی، از جمله نوع ویژگی (نقطه، چند خط، چند ضلعی و موارد دیگر) تعیین کنند. خصوصیات یک مجموعه داده اغلب برای تأیید پارامترهای ابزار مورد نیاز است. به عنوان مثال، هنگام استفاده از ابزار Union، پارامتر ویژگی های ورودی باید از کلاس های ویژگی چندضلعی تشکیل شده باشد و سایر انواع هندسه نامعتبر هستند. جعبههای محاورهای ابزار دارای اعتبارسنجی داخلی هستند تا از انتخاب کلاسهای ویژگی که از نوع ویژگی نامعتبر هستند جلوگیری کنند. در یک اسکریپت پایتون، باید از توابع برای تعیین نوع ویژگی یک مجموعه داده قبل از استفاده از آن در ابزار استفاده کنید.
دو تابع در ArcPy برای توصیف مجموعه داده ها وجود دارد:arcpy.Describe()وarcpy .da.Describe(). این دو وظایف یکسان را انجام می دهند، اما ساختار عملکردها تا حدودی متفاوت است. هر دو تابع معمولا استفاده می شوند، بنابراین خوب است که هر دو را بدانید.
اول،توصیف کردن()تابع یک تابع معمولی از ArcPy است، مانندوجود دارد()یاImportToolbox(). درتوصیف کردن()تابع a را برمی گرداندتوصیف کردن()شی، و می توانید از شی برای بررسی ویژگی های آن، مانند نوع داده استفاده کنید. خواص ازتوصیف کردن()شی پویا است، به این معنی که ویژگی های موجود برای استفاده با ماهیت شیء توصیف شده متفاوت است. این رفتار انعطافپذیری زیادی را فراهم میکند، اما همچنین میتواند منجر به سردرگمی شود، زیرا تا زمانی که نوع داده را تعیین نکنید، نمیدانید کدام ویژگیها در دسترس هستند.
دوم،da.Describe()تابع تابعی ازarcpy.daماژول یا ماژول دسترسی به داده. علاوه بر توصیف دادهها، این ماژول ArcPy برای ویرایش وظایف و به عنوان پشتیبانی از گردشهای کاری پایگاه داده مانند نسخهسازی، کپیها، دامنهها و انواع فرعی استفاده میشود. فصلهای بعدی همچنان از ماژول دسترسی به دادهها برای کارهای دیگر استفاده میکنند، اما در این فصل تمرکز بر توصیف دادهها است. درda.Describe()تابع همان اطلاعات را برمی گرداندتوصیف کردن()عملکرد اما در قالب یک فرهنگ لغت. تفاوت بین این دو تابع با جزئیات بیشتری مورد بحث قرار گرفته است، از جمله چندین نمونه کد برای مصور.
نحو برای توصیف یک مجموعه داده با استفاده ازتوصیف کردن()تابع است
arcpy.Describe(< مجموعه داده ورودی>، {datatype})
اجرای کد a را برمی گرداندتوصیف کردنشیئی که حاوی خصوصیات مجموعه داده است. این ویژگی ها با استفاده از<object>.<property>نشانه گذاری. به عنوان مثال، کد زیر یک شکل فایل را توصیف می کند و سپس نوع شکل هندسی را چاپ می کند:
واردات کمان
desc = arcpy.Describe(“C:/Data/streams.shp”)
print(desc.shapeType)
برای یک شکل فایل چند خطی، نتیجه این استپلی لاین. در این مثال،توصیفهستتوصیف کردنشی برگردانده شده توسط تابع، وshapeTypeیک خاصیت شی است.
همین کار را می توان با استفاده ازda.Describe()عملکرد. نحو این تابع است
arcpy.da.Describe(< مجموعه داده ورودی>، {datatype})
اجرای کد یک فرهنگ لغت با مواردی که مجموعه داده ورودی را توصیف می کند، باز می گرداند. یک فرهنگ لغت پایتون از جفت کلید و مقادیر مربوط به آنها تشکیل شده است. کلیدهای موجود در فرهنگ لغت با ویژگی های the مطابقت دارندتوصیف کردنشی برگردانده شده توسطتوصیف کردن()عملکرد. به عبارت دیگر، فرهنگ لغت حاوی همان اطلاعات شی است، اما به جای خواص و مقادیر آنها، فرهنگ لغت از کلیدها و مقادیر مربوط به آنها استفاده می کند.
به عنوان مثال، کد زیر همان وظیفه اسکریپت قبلی را انجام می دهد اما این بار با استفاده ازda.Describe()عملکرد:
واردات کمان
desc = arcpy.da.Describe(“C:/Data/streams.shp”)
چاپ (درسی[“شکل”])
نتیجه چاپ شده یکسان است – یعنیپلی لاین. کد کمی متفاوت است زیراda.Describe()تابع یک فرهنگ لغت را برمی گرداند. در این فرهنگ لغت،shapeTypeکلید است، وپلی لاینمقدار مربوطه است.
علیرغم تفاوت در نحو، هر دو تابع یک کار را انجام می دهند. درda.Describe()تابع جدیدتر به عملکرد ArcPy اضافه شده است. بنابراین، شما خواهید دیدتوصیف کردن()تابع به طور گسترده تر استفاده می شود. با این حال، برای اسکریپت های جدید، توصیه می شود از آن استفاده کنیدda.Describe()عملکرد. اگرچه استفاده ازتوصیف کردن()عملکرد سریعتر ازda.Describe()عملکرد، دومی شفاف تر است زیرا کلیدها به راحتی در دسترس هستند.
توجه داشته باشید:نمونه های کد در این کتاب به نفع استفاده ازda.Describe()عملکرد، اماتوصیف کردن()در مناسبت ها نیز استفاده می شود.
ممکن است متوجه شده باشید که هر دو عملکرد دارندنوع دادهبه عنوان یک پارامتر اختیاری این پارامتر می تواند در هنگام وجود تداخل نامگذاری استفاده شود. مثال قبلی یک مسیر کاتالوگ به نام C:\Data\study.gdb\final را در نظر بگیرید. اگر می دانید که “نهایی” یک مجموعه داده ویژگی است و نه یک کلاس ویژگی یا شطرنجی، می توانید نوع داده را به عنوان پارامتر تعیین کنید تا از هرگونه سردرگمی جلوگیری شود.
هر دوتوصیف کردن()تابع وda.Describe()تابع را می توان در مجموعه داده های مختلف از جمله کلاس های ویژگی پایگاه داده جغرافیایی، فایل های شکل، رسترها و جداول استفاده کرد. برای هر دو تابع، نتایج پویا هستند. در موردتوصیف کردن()تابع، ویژگی های شی پویا هستند، در حالی که در موردda.Describe()عملکرد، کلیدهای فرهنگ لغت پویا هستند. پویا بودن به این معنی است که ویژگی ها یا کلیدهای موجود به ترتیب به نوع داده ای که توضیح داده می شود بستگی دارد.
از آنجایی که دارایی های مختلف بسیار زیادی وجود دارد، آنها به یک سری از گروه های دارایی سازماندهی می شوند. این گروه بندی بر نحو تأثیر نمی گذارد – نام گروه ویژگی در نحو ظاهر نمی شود – اما یک سازماندهی منطقی از همه ویژگی ها ارائه می دهد.
یکی از گروه اموال مهم استکلاس ویژگی. شاملshapeTypeویژگی مورد استفاده در کد مثال قبلی درکلاس ویژگیخواص دسترسی بهکلاس ویژگینوع داده، که می تواند یک پایگاه جغرافیایی، شکل فایل یا نوع دیگری از کلاس ویژگی باشد.
در بسیاری از موارد، برای تعیین صحیح پارامترهای ابزار باید به ویژگی ها دسترسی داشته باشید. به عنوان مثال، کد زیر نوع شکل هندسی ویژگی ها را تعیین می کند و ابزار Clip تنها در صورتی اجرا می شود که نوع شکل یک چند ضلعی باشد:
واردات کمان
arcpy.env.workspace = “C:/Data”
infc = “streams.shp”
clipfc = “study.shp”
outfc = “streams_clip.shp”
desc = arcpy.da.Describe(clipfc)
type = desc[“shapeType”]
اگر نوع == “Polygon”:
arcpy.Clip_analysis(infc، clipfc، outfc)
دیگر:
print (“ویژگی های کلیپ چند ضلعی نیستند.”)
کد اغلب می تواند کوتاه شود. به عنوان مثال، خطوط 6، 7، و 8 در اسکریپت را می توان با خط زیر جایگزین کرد:
if arcpy.da.Describe(clipfc)[“shapeType”] == “چند ضلعی”:
اگرچه این کد بسیار کوتاهتر است، اما خواندن آن نیز تا حدودی دشوارتر است، بنابراین تمرین خوبی است که کد خود را به مراحل کوچکتر تقسیم کنید و مراحل را آسانتر دنبال کنید. علاوه بر این، ممکن است به مراحل میانی نیاز داشته باشید. به عنوان مثال، اگر باید به ویژگی های اضافی دسترسی داشته باشید، ممکن است از اختصاص فرهنگ لغت به یک متغیر بهره مند شوید تا بتوانید بعداً دوباره در همان اسکریپت بدون نیاز به استفاده از آن استفاده کنید.da.Describe()از نو.
بسیاری از گروه های دارایی مفید دیگر، از جملهمجموعه دادهخواص این گروه ویژگی شامل ویژگی هایی مانند نوع مجموعه داده و مرجع مکانی است. کد زیر یک شکل فایل را توصیف می کند و نوع مجموعه داده و نام مرجع فضایی را چاپ می کند:
واردات کمان
fc = “C:/Data/streams.shp”
desc = arcpy.da.Describe(fc)
sr = desc[“SpatialReference”]
print(“نوع مجموعه داده: ” + desc[“shapeType”])
print(“مرجع مکانی: ” + sr.name)
در مورد یک شکل فایل به نام streams.shp، نوع مجموعه داده یک کلاس ویژگی است. با این حال، در بسیاری از موارد نوع مجموعه داده چندان واضح نیست. کد زیر نوع داده یک عنصر را در یک پایگاه داده جغرافیایی تعیین می کند:
واردات کمان
element = “C:/Data/study.gdb/final”
desc = arcpy.da.Describe(element)
print(“نوع مجموعه داده: ” + desc[“datasetType”])
تعیین نوع داده می تواند مهم باشد زیرا عناصر داخل یک پایگاه جغرافیایی پسوند فایل ندارند. عنصری به نام “نهایی” می تواند یک کلاس ویژگی، یک مجموعه داده ویژگی، یک جدول پایگاه داده جغرافیایی یا هر نوع داده معتبر دیگری باشد. انواع داده های معتبر متعددی از جمله وجود داردکلاس ویژگی،FeatureDataset،RasterBand،RasterDataset، وجدول. صفحات راهنمای ArcGIS Pro برایتوصیف کردن()وda.Describe()توابع حاوی لیست کاملی از انواع داده های معتبر هستند.
توجه داشته باشید:در صفحات راهنما، گروه های دارایی ازda.Describe()پیوند تابع به کسانی که ازتوصیف کردن()تابع، و تنها یک مجموعه از گروههای ویژگی با فهرستی دقیق از ویژگیها وجود دارد که برای هر دو تابع اعمال میشود. در نتیجه، بسیاری از کدهای نمونه در صفحات راهنما از کد استفاده می کنندتوصیف کردن()عملکرد، اما همان وظایف را می توان با استفاده از آن انجام دادda.Describe().
دو تابع برای توصیف مجموعه داده ها همچنین به بسیاری از ویژگی های مرتبط دیگر دسترسی دارند. این ویژگی ها شامل مسیر فایل، مسیر کاتالوگ، نام، نام فایل و نام پایه است. اجرای کد زیر چندین مورد از این ویژگی ها را چاپ می کند:
واردات کمان
arcpy.env.workspace = “C:/Data/study.gdb”
عنصر = “جاده ها”
desc = arcpy.da.Describe(element)
print(“نوع داده: ” + desc[“dataType”])
print(“مسیر فایل: ” + desc[“path”])
print(“مسیر کاتالوگ: ” + desc[“catalogPath”])
print(“نام فایل: ” + desc[“file”])
print(“نام پایه: ” + توصیف [“baseName”])
print(“Name:” + desc[“name”])
نتیجه به شرح زیر است:
نوع داده: FeatureClass
مسیر فایل: C:/Data/study.gdb
مسیر کاتالوگ: C:/Data/study.gdb/roads
نام فایل: جاده ها
نام پایه: جاده ها
نام: جاده ها
مسیرها و نامها ممکن است گیجکننده باشند، بنابراین میتوان از این ویژگیها برای تأیید مقادیرشان استفاده کرد، بهویژه برای عناصر داخل یک پایگاه جغرافیایی، زیرا پسوند فایل ندارند. فصل 10 مثال های بیشتری از استفاده ازتوصیف کردن()وda.Describe()توابع بر روی شطرنجی ها
6.4داده های فهرست شده
پردازش دسته ای، اجرای چندین بار یک ابزار واحد با استفاده از پارامترهای مختلف، یکی از دلایل اصلی توسعه اسکریپت های پردازش جغرافیایی است. در فصل 3، چندین روش برای استفاده از پردازش دسته ای مشاهده کردید، از جمله گزینه اجرای ابزارها در حالت دسته ای. با این حال، محدودیتهایی در استفاده از حالت دستهای وجود دارد و اسکریپتنویسی چارچوب قدرتمندتر و انعطافپذیرتری را برای پردازش دستهای فراهم میکند.
یکی از وظایف کلیدی در پردازش دسته ای، تهیه فهرستی از داده های موجود است تا یک اسکریپت بتواند در طول پردازش روی داده ها تکرار شود. ArcPy شامل چندین توابع برای داده های موجودی است. این توابع فهرستی را برمیگردانند که شامل فهرستی از موارد است. یک لیست می تواند حاوی هر نوع داده ای باشد، اما رشته ها رایج ترین نوع هنگام کار با توابع لیست ArcPy هستند.
اصل استفاده از یک لیست این است که یک اسکریپت می تواند از طریق مقادیر موجود در لیست حلقه بزند تا با هر یک به طور جداگانه کار کند. کار با لیست در پایتون معمولاً به یک نیاز داردبرایحلقه توابع لیست ArcPy شاملListFields()،ListIndexes()،ListDatasets()،ListFeatureClasses()،ListFiles()،ListRasters()،ListTables()،ListWorkspaces()، وListVersions().
پارامترهای این توابع مشابه هستند. برخی از توابع به یک مجموعه داده ورودی نیاز دارند زیرا موارد مورد علاقه در یک مجموعه داده یا شی قرار دارند. سایر توابع به مجموعه داده نیاز ندارند زیرا موارد مورد علاقه در فضای کاری فعلی قرار دارند. یک فضای کاری لازم است زیرا نمی توانید مسیری را برای این توابع ارسال کنید. همه توابع دارای یک پارامتر wildcard هستند (*) که یک فیلتر نام را تعریف می کند. علامت عام نمادی است که یک یا چند کاراکتر را نشان می دهد. در زمینه توابع لیست ArcPy، از علامت عام برای فهرست کردن فقط عناصری استفاده میشود که بر اساس نام آنها معیار خاصی را برآورده میکنند.
یکی از پرکاربردترین توابع لیستی استarcpy.ListFeatureClasses()تابع، که لیستی از کلاس های ویژگی را در فضای کاری فعلی برمی گرداند. سینتکس تابع به صورت زیر است:
arcpy.ListFeatureClasses({wild_card}، {feature_type}،
{feature_dataset})
این تابع دارای سه پارامتر است که همه آنها اختیاری هستند. این پارامترها امکان محدود کردن لیست را بر اساس نام، نوع ویژگی یا مجموعه داده ویژگی امکان پذیر می کند. به عنوان مثال، کد زیر لیستی از تمام کلاس های ویژگی در فضای کاری فعلی را بدون تنظیم هیچ یک از پارامترهای اختیاری برمی گرداند:
واردات کمان
arcpy.env.workspace = “C:/Data”
fclist = arcpy.ListFeatureClasses()
همه توابع لیست یک لیست را برمی گرداند. برای تایید محتویات یک لیست، می توانید مقادیر را با استفاده از عبارتی مانند زیر چاپ کنید:
چاپ (fclist)
یک لیست چاپی از کلاس های ویژگی به شرح زیر است:
[‘floodzone.shp’، ‘roads.shp’، ‘streams.shp’، ‘wetlands.shp’، ‘zipcodes.shp’]
یک لیست پایتون از عناصر با براکت [ ] احاطه شده است و عناصر با کاما از هم جدا می شوند. در مورد لیستی از کلاس های ویژگی، عناصر رشته هایی هستند که نام کلاس های ویژگی را نشان می دهند.
علامت عام لیست را با نام محدود می کند. به عنوان مثال، کد زیر لیستی از تمام کلاس های ویژگی در فضای کاری فعلی ایجاد می کند که با حرف w شروع می شود:
fclist = arcpy.ListFeatureClasses(“w*”)
پارامتر دوم درListFeatureClasses()تابع نوع ویژگی است. این پارامتر لیست را برای مطابقت با ویژگی های داده خاص، مانند فقط کلاس های ویژگی نقطه، محدود می کند. برای مثال، کد زیر فهرستی از تمام کلاسهای ویژگی نقطه در فضای کاری فعلی ایجاد میکند:
fclist = arcpy.ListFeatureClasses(“”, “point”)
به استفاده از یک رشته خالی توجه کنید (“”) برای علامت عام. پارامترها باید به ترتیب تعریف شده توسط نحو وارد شوند و نمی توان آنها را نادیده گرفت مگر اینکه به طور خاص با نام به آنها اشاره کنید. استفاده كردن”*”همان نتیجه را برای این پارامتر به عنوان یک رشته خالی ارائه می دهد. انواع ویژگی های معتبر عبارتند از حاشیه نویسی، قوس، بعد، لبه، اتصال، برچسب، خط، چند وصله، گره، نقطه، چند ضلعی، چند خط، منطقه، مسیر، و تیک. چندین نوع از این ویژگی ها نشان دهنده انواع قدیمی مرتبط با پوشش ها هستند که دیگر در ArcGIS Pro پشتیبانی نمی شوند.
توجه داشته باشید:اگرچه پایتون به طور کلی به حروف کوچک و بزرگ حساس است، اما آرگومانها در ArcPy بخشندهتر هستند. به عنوان مثال، برای پارامتر دوم، می توانید استفاده کنید“نقطه”یا“نقطه”بجای“نقطه”. با این حال، توابع و کلاسهای ArcPy باید با استفاده از حروف بزرگ صحیح در مستندات فراخوانی شوند. مثلا،ListFeatureclasses()منجر به یکAttributeErrorزیرا تابع را نمی توان یافت.
برای ایجاد لیستی از مجموعه داده های شطرنجی در فضای کاری فعلی، ازarcpy.ListRasters()عملکرد. نحو نزدیک به نحو استListFeatureClasses()عملکرد:
arcpy.ListRasters({wild_card}، {raster_type})
این دو پارامتر اختیاری هستند و به شما امکان می دهند لیست را بر اساس نام یا نوع محدود کنید. کد زیر لیستی از تمام مجموعه داده های شطرنجی در فضای کاری فعلی ایجاد می کند:
واردات کمان
arcpy.env.workspace = “C:/Data”
rasterlist = arcpy.ListRasters()
برای محدود کردن لیست به تمام رسترهایی که تصاویر TIFF هستند، پارامتر نوع شطرنجی را به صورت زیر مشخص کنید:
rasterlist = arcpy.ListRasters(“”, “TIF”)
پارامتر نوع شطرنجی باید به عنوان پسوند فایل مشخص شود، نه نام عمومی قالب. به عنوان مثال، یک فایل TIFF دارای پسوند فایل .tif است، بنابراین “TIF” نحو صحیح است. به طور مشابه، یک فایل JPEG دارای پسوند فایل .jpg است، بنابراین “JPG” نحو صحیح است. نحو برای انواع داده های شطرنجی به حروف بزرگ و کوچک حساس نیست، بنابراین هر دو “TIF” و ”tif” درست هستند. همچنین توجه داشته باشید که فرمت Esri GRID پسوند فایل ندارد و نحو مناسب برای این فرمت “توری” (همچنین به حروف بزرگ و کوچک حساس نیست). انواع داده های شطرنجی معتبر شاملBMP،GIF،IMG،JP2،JPG،PNG،TIF، وتوری.
یکی دیگر از عملکردهای رایج لیست استفاده می شودarcpy.ListFields(). این تابع فیلدهای یک کلاس ویژگی یا جدول را برای یک مجموعه داده مشخص فهرست می کند. نحو است
arcpy.ListFields(مجموعه داده، {wild_card}، {field_type})
درListFields()تابع دارای سه پارامتر است که تنها پارامتر اول (مجموعه داده) مورد نیاز است. مجموعه داده کلاس ویژگی یا جدولی است که فیلدهای آن به عنوان مقادیر در یک لیست بازگردانده می شود. به عنوان مثال، کد زیر لیستی از تمام فیلدهای یک shapefile ایجاد می کند:
واردات کمان
arcpy.env.workspace = “C:/Data”
fieldlist = arcpy.ListFields(“roads.shp”)
دو پارامتر اختیاری به شما این امکان را می دهد که لیست را بر اساس نام یا نوع فیلد محدود کنید. کد زیر لیستی از تمام فیلدهای یک شکل فایل که اعداد صحیح هستند ایجاد می کند:
fieldlist = arcpy.ListFields(“roads.shp”، “””، “Integer”)
انواع فیلدهای معتبر شامللکه(شئی بزرگ دودویی)،تاریخ،دو برابر،هندسه،شناسه جهانی،GUID،عدد صحیح،OID،شطرنجی،تنها،SmallInteger، ورشته. انواع فیلدها به صورت رشته ای نوشته می شوند و به حروف بزرگ و کوچک حساس نیستند.
توجه داشته باشید که نام انواع فیلد استفاده شده توسطListFields()تابعی که در برنامه ArcGIS Pro استفاده می شود یکسان نیست. نوععدد صحیحطولانی نامیده می شود.تنهاشناور نامیده می شود.SmallIntegerبه عنوان کوتاه نامیده می شود. ورشتهمتن نامیده می شود. این نامگذاری می تواند منبع سردرگمی باشد زیراarcpy.AddField()تابع با اصطلاحات برنامه ArcGIS Pro سازگار است. هنگام اضافه کردن یک فیلد با استفاده ازAddField()تابع، انواع فیلدهای قبلی به عنوان نامیده می شوندبلند،شناور،کوتاه، وTEXT، به ترتیب.
درListFields()تابع لیستی ازرشتهاشیاء. در مقابل، بیشتر توابع فهرست دیگر، فهرستی از رشته ها را برمی گرداند. آرشتهشی نشان دهنده یک ستون در یک جدول است.رشتهخواص شی شاملنام،نام مستعار،نوع، وطول. بخش بعدی شامل مثالی از استفاده از این ویژگی ها است. توجه داشته باشید کهنوعویژگی از همان انواع فیلد استفاده می کندListFields()تابع – به عنوان مثال، یک عدد صحیح طولانی به عنوان یک نامیده می شودعدد صحیحو غیره
یکی دیگر از عملکردهای مفید لیست این استarcpy.ListFiles(). این تابع لیستی از تمام فایل های یک فضای کاری را برمی گرداند. نحو کلی ازListFiles()تابع است
arcpy.ListFiles ({wild_card})
تنها پارامتر یک علامت عام اختیاری برای محدود کردن نتایج است. درListFiles()عملکرد مشابه باز کردن پوشه مورد علاقه در یک برنامه مدیریت فایل مانند Windows Explorer است. این کمی با مشاهده فایلها در صفحه کاتالوگ در ArcGIS Pro متفاوت است. مثال زیر از نمای کاتالوگ پوشه ای به نام Greenway را در نظر بگیرید.
پوشه C:\Greenway شامل زیرپوشههای مختلف و همچنین یک پایگاه جغرافیایی فایل (gdb.)، یک فایل Microsoft Excel (xlsx.)، یک فایل جعبه ابزار (tbx.)، یک shapefile (.shp)، و چندین فایل CSV ( .csv). کد برای استفاده ازListFiles()عملکرد این پوشه به صورت زیر است:
واردات کمان
arcpy.env.workspace = “C:/Testing/Demo/Greenway”
برای فایل در arcpy.ListFiles():
چاپ (فایل)
نتیجه به صورت زیر چاپ می شود:
datasheet1.csv
datasheet2.csv
datasheet3.csv
Greenway.aprx
Greenway.gdb
Greenway.tbx
ImportLog
فهرست مطالب
parks.dbf
parks.prj
parks.sbn
parks.sbx
parks.shp
parks.shp.xml
parks.shx
پروژه
Report.docx
survey_results.xlsx
نتایج چند چیز را در مورد این نشان می دهدListFiles()عملکرد. ابتدا، زیرپوشه ها نشان داده می شوند، اما محتویات داخل آن پوشه ها نشان داده نمی شوند. به عنوان مثال، فایل های شکل داخل پوشه Project در لیست نیستند. دوم، پایگاه های جغرافیایی فایل گنجانده شده است، اما محتوای آنها گنجانده نشده است. به عنوان مثال، کلاس های ویژگی داخل فایل Greenway.gdb در لیست نیستند. ثالثاً، شیپ فایلهای منفرد از چندین فایل با نام پایه یکسان و پسوندهای مختلف تشکیل شدهاند. درListFiles()تابع همه آن فایلها را بهطور جداگانه فهرست میکند، که فقط از یک ورودی شکل فایل در نمای کاتالوگ تشکیل شدهاند. و در نهایت، برخی از فایل ها در نمای کاتالوگ در ArcGIS Pro نشان داده نمی شوند، اما لیست شده اند. این فایل ها شامل سند Microsoft Word به نام Report.docx است.
این نتایج نشان می دهد کهListFiles()تابع از دیدگاه مدیریت فایل استفاده می کند و ماهیت داده های اساسی را در نظر نمی گیرد. هنگام کار با قالبهای دادههای مکانی، مانند فایلهای شکل و پایگاههای جغرافیایی، توصیه میشود از دیگر توابع فهرست ArcPy از جمله استفاده کنید.ListFeatureClasses()،ListWorkspaces()،ListDatasets()، و غیره.
درListFiles()تابع معمولاً برای فهرست کردن فایلهای مستقلی که مجموعه دادههای فضایی نیستند، از جمله فایلهای CSV (.csv)، فایلهای Microsoft Excel (xlsx.) و فایلهای متنی ساده (txt.) استفاده میشود. به عنوان مثال، کد مثال زیر لیستی از فایلهای CSV را در یک فضای کاری ایجاد میکند:
واردات کمان
arcpy.env.workspace = “C:/Testing/Demo/Greenway”
برای فایل در arcpy.ListFiles(“*.csv”):
چاپ (فایل)
نتیجه به صورت زیر چاپ می شود:
datasheet1.csv
datasheet2.csv
datasheet3.csv
به جای چاپ نام فایلها، در یک گردش کار معمولی GIS، از فهرست فایلهای CSV برای انجام کارهای معنادارتر استفاده میشود، مانند کپی کردن دادهها از هر فایل CSV در جدول پایگاه داده جغرافیایی یا استفاده از دادههای هر فایل CSV برای ایجاد ویژگیهای جدید. . فصل 8 این مثال ها را دوباره بررسی می کند.
6.5فضاهای کاری و داده های فهرست بندی
هنگام کار با توابع فهرست ArcPy، بسیار مهم است که از فضای کاری استفاده شده و معنای فضاهای کاری در زمینه فرمت های مختلف داده های مکانی آگاه باشید. سناریویی را در نظر بگیرید که در آن پوشهای دارید که شامل فایلهای شکل و یک پایگاه جغرافیایی فایل با کلاسهای ویژگی متعدد است.
شرح
پوشه MyData حاوی یک پایگاه جغرافیایی به نام City.gdb با کلاسهای ویژگی bus_routes و bus_stops و shapefiles به نام services.shp، parks.shp و roads.shp در پوشه اصلی است.
در نظر بگیرید که هنگام استفاده از آن چه اتفاقی می افتدListFeatureClasses()با تنظیم فضای کاری روی MyData روی این پوشه عمل کنید:
واردات کمان
arcpy.env.workspace = “C:/Testing/MyData”
fcs = arcpy.ListFeatureClasses()
چاپ (fcs)
نتیجه به صورت زیر چاپ می شود:
[‘facilities.shp’، ‘parks.shp’، ‘roads.shp’]
لیست به دست آمده از کلاس های ویژگی فقط شامل فایل های شکل می شود. چرا کلاس های ویژگی در پایگاه داده جغرافیایی بخشی از نتیجه نیستند؟ پاسخ در نگاهی دقیق تر به استفاده از فضاهای کاری نهفته است. به عنوان مثال، فضای کاری برای shapefile parks.shp C:\MyData است. با این حال، فضای کاری برای bus_routes کلاس ویژگی پایگاه جغرافیایی، خود پایگاه داده جغرافیایی است – یعنی C:\MyData\City.gdb. برای فهرست کردن کلاسهای ویژگی پایگاه جغرافیایی، باید پایگاه جغرافیایی را بهعنوان فضای کاری به صورت زیر مشخص کنید:
واردات کمان
arcpy.env.workspace = “C:/Testing/MyData/City.gdb”
fcs = arcpy.ListFeatureClasses()
چاپ (fcs)
نتیجه به صورت زیر چاپ می شود:
[‘bus_routes’، ‘bus_stops’]
عناصر داخل یک پایگاه داده جغرافیایی به دلیل نحوه تعریف فضاهای کاری به رویکردی متفاوت از فایلهای شیپ و سایر مجموعههای داده مستقل نیاز دارند. فضای کاری یک عنصر در داخل یک پایگاه جغرافیایی، خود پایگاه جغرافیایی است، در حالی که برای مجموعه دادههای مستقل، فضای کاری صرفاً پوشه ریشه است.
برای کنترل بهتر محیط های کاری، ازarcpy.ListWorkspaces()عملکرد. ساختار پوشه پیچیده تری را در نظر بگیرید، با یک زیرپوشه که حاوی شکل فایل های بیشتری و دو پایگاه داده جغرافیایی فایل است.
شرح
پوشه Project حاوی یک زیرپوشه به نام Shapefiles، با فایل های shapefiles به نام امکانات.shp، parks.shp، و roads.shp است. یک پایگاه جغرافیایی به نام City.gdb، با کلاس های ویژگی به نام bus_routes و bus_stops. یک پایگاه جغرافیایی به نام Water.gdb، با کلاسهای ویژگی به نام نظارت، نهرها و حوزههای آبخیز. و یک شکل فایل به نام boundaries.shp در پوشه ریشه.
هنگامی که فضای کاری در اسکریپت روی C:\Project تنظیم شده است،ListFeatureClasses()تابع فقط shapefile boundaries.shp را برمی گرداند. می توانید استفاده کنیدListWorkspaces()تابعی برای فهرست کردن فضاهای کاری در فضای کاری مجموعه. نحو کلی برای این تابع است
arcpy.ListWorkspaces({wild_card}، {workspace_type})
دو پارامتر برای این تابع اختیاری هستند. در نظر بگیرید که چگونهListWorkspaces()تابع را می توان برای ساختار پوشه پیچیده تر استفاده کرد:
واردات کمان
arcpy.env.workspace = “C:/Project”
wspaces = arcpy.ListWorkspaces()
چاپ (wspaces)
نتیجه به صورت زیر چاپ می شود:
[‘C:/Project\\City.gdb’، ‘C:/Project\\Shapefiles’،
‘C:/Testing\\Water.gdb’]
نتیجه شامل دو پایگاه داده جغرافیایی و پوشه ای است که حاوی فایل های شکل است. هر یک از این سه عنصر یک فضای کاری جداگانه در فضای کاری مجموعه در اسکریپت است.
درListWorkspaces()تابع پنج نوع مختلف فضای کاری را تشخیص می دهد:
- ACCESS (پایگاه های جغرافیایی شخصی)
- پوشش (پوشش ها)
- FILEGDB (پایگاه های جغرافیایی فایل)
- FOLDER (شکل فایل ها)
- SDE (پایگاه جغرافیایی سازمانی)
دو مورد اول از این نوع، فضاهای کاری قدیمی برای قالبهای دادهای هستند که دیگر پشتیبانی نمیشوند. نوع فضای کاری را می توان به عنوان پارامتر دوم تنظیم کردListWorkspaces()عملکرد، به شرح زیر است:
wspaces = arcpy.ListWorkspaces(“”, “FILEGDB”)
نتیجه به صورت زیر چاپ می شود:
[‘C:/Project\\City.gdb’، ‘C:/Project\\Water.gdb’]
این مثال مفید است زیرا به شما امکان می دهد تمام پایگاه های جغرافیایی را در یک فضای کاری فهرست کنید. هیچ تابع ArcPy فراخوانی نشده استListGeodatabases()به عنوان مثال، بنابراین شما این کار را با فهرست کردن تمام فضاهای کاری پایگاه داده جغرافیایی فایل انجام می دهید. به عنوان جایگزین، می توانید ازListFiles()عملکرد و نتایج را بر اساس پسوند فایل .gdb فیلتر کنید.
چند مشاهدات در هنگام استفاده ازListWorkspaces()عملکرد:
- حتی اگر پایگاههای جغرافیایی و پوششهای شخصی به عنوان یک نوع فضای کاری پشتیبانی میشوند، این قالبهای داده دیگر در ArcGIS Pro پشتیبانی نمیشوند و استفاده از آنها تشویق نمیشود.
- نوع فضای کاری FOLDER کمی گمراه کننده است: هر پوشه سیستمی معمولی که به طور بالقوه می تواند حاوی فایل های شکل یا سایر مجموعه های داده باشد، در اینجا گنجانده شده است، حتی اگر پوشه حاوی هیچ فایلی نباشد. این تابع تعیین نمی کند که آیا هیچ شکل فایل یا سایر مجموعه داده های فضایی وجود دارد یا خیر.
هنگام کار با ساختارهای پوشه پیچیده، چالش های اضافی وجود دارد. مثال زیر را از یک پوشه حاوی چندین پایگاه جغرافیایی و شکل فایل در ساختار زیرپوشه در نظر بگیرید.
شرح
پوشه پروژه حاوی زیرپوشه ای به نام Planning، با یک پایگاه جغرافیایی به نام Education.gdb، با کلاس های ویژگی به نام مدارس و واحدها است. زیرپوشه ای به نام Shapefiles، با فایل های shapefiles به نام های points.shp، parks.shp، و roads.shp. دو geodatabase به نام های City.gdb و Water.gdb در پوشه ریشه. و یک شکل فایل به نام boundaries.shp در پوشه ریشه.
در این مثال، یک پایگاه جغرافیایی فایل به نام Education.gdb در زیر پوشه ای به نام Planning قرار دارد. استفاده از را در نظر بگیریدListWorkspaces()عملکرد اینجا:
wspaces = arcpy.ListWorkspaces()
نتیجه به صورت زیر چاپ می شود:
[‘C:/Project\\City.gdb’، ‘C:/Project\\Planning’، ‘C:/ Project\\Shapefiles’، ‘C:/Project\\Water.gdb’]
پوشه C:\Planning در نتایج گنجانده شده است زیرا به عنوان یک فضای کاری FOLDER شناخته می شود – نه به این دلیل که شامل مجموعه داده های فضایی است بلکه صرفاً به این دلیل که یک پوشه سیستمی معمولی است. فایل geodatabase Education.gdb شناسایی نمی شود زیرا در یک زیرپوشه قرار دارد و در فضای کاری تنظیم شده در اسکریپت نیست.
مجموعه داده های ویژگی در یک پایگاه داده جغرافیایی یک عارضه دیگر را فراهم می کند. پایگاه جغرافیایی زیر، Transportation.gdb را در نظر بگیرید.
شرح
پایگاه جغرافیایی حمل و نقل شامل مجموعه داده ویژگی به نام دوچرخه سواری، با کلاس های ویژگی به نام مسیرهای دوچرخه و گذرگاه ها است. و کلاس هایی به نام roads and traffic_lights را در ریشه پایگاه جغرافیایی مشخص کنید.
هنگامی که پایگاه داده جغرافیایی به عنوان فضای کاری تنظیم می شود، تابعListFeatureClasses()دو کلاس ویژگی را در ریشه پایگاه داده، جادهها و چراغهای ترافیک را برمیگرداند، اما نه کلاسهای ویژگی را در مجموعه داده ویژگی. برای رسیدن به آن کلاسهای ویژگی، مجموعه داده ویژگی Cycling باید بهعنوان فضای کاری به صورت زیر تنظیم شود:
واردات کمان
arcpy.env.workspace = “C:/Project/Transportation.gdb/Cycling”
fcs = arcpy.ListFeatureClasses()
چاپ (fcs)
نتیجه به صورت زیر چاپ می شود:
[‘bike_routes’، ‘crossings’]
مهم است که بدانیم مجموعه داده های ویژگی را می توان به عنوان یک فضای کاری استفاده کرد، اما آنها نوعی از فضای کاری نیستند که توسطListWorkspaces()عملکرد. به عبارت دیگر، اگر فضای کاری روی یک پایگاه جغرافیایی فایل تنظیم شده باشد، با استفاده ازListWorkspaces()یک لیست خالی برمی گرداند. اگر به طور خاص به دنبال مجموعه داده های ویژگی هستید، از آن استفاده کنیدarcpy.ListDatasets()عملکرد.
نحو کلی این تابع است
arcpy.ListDatasets({wild_card}، {feature_type})
هنگامی که این تابع در پایگاه داده جغرافیایی مثال اعمال می شود، مجموعه داده ویژگی را به شرح زیر برمی گرداند:
واردات کمان
arcpy.env.workspace = “C:/Project/Transportation.gdb”
dsets = arcpy.ListDatasets()
چاپ (دست)
نتیجه به صورت زیر چاپ می شود:
[‘دوچرخه سواري’]
درListDatasets()تابع همچنین می تواند چندین عنصر دیگر از پایگاه داده جغرافیایی، از جمله شبکه های هندسی، شبکه ها، کاتالوگ شطرنجی، توپولوژی و چندین عنصر دیگر را برگرداند.
در حال حاضر، باید مشخص باشد که فهرست کردن تمام دادهها در یک پوشه به دلیل فرمتهای مختلف داده و ساختارهای زیرپوشه پیچیده است. برای تسهیل کار با ساختارهای پوشه و فایل پیچیده تر، می توانید ازarcpy.da.Walk()عملکرد. این تابعی از ماژول دسترسی به داده است و به طور خاص برای بالا و پایین رفتن در ساختار پوشه و پایگاه داده طراحی شده است.
توجه داشته باشید:درda.Walk()عملکرد ArcPy مانندos.walk()عملکردی که بخشی از داخلی استسیستم عاملمدول. با این حال،os.walk()فقط مسیرهای سیستم را تشخیص می دهد.da.Walk()برای تکرار این قابلیت اما برای مسیرهای کاتالوگ و همچنین مسیرهای سیستم طراحی شده است.
نحو کلی برایda.Walk()تابع است
arcpy.da.Walk(بالا، {topdown}، {onerror}، {followlinks}، {datatype}،
{نوع})
تنها آرگومان مورد نیاز، فضای کاری سطح بالایی است که استفاده خواهد شد. پارامترهای اختیاری فیلتر کردن نتایج بر اساس نوع داده و همچنین کنترل سایر جنبههای تابع را ممکن میسازد.
نتیجه یک سه تایی برای هر دایرکتوری یا فضای کاری است که شامل فضای کاری، نام پوشه ها و نام فایل ها می شود. برای مشاهده نتایج، باید روی عناصر تاپل تکرار کنید. همانطور که در شکل نشان داده شده است، مثال قبلی پوشه MyData را در نظر بگیرید.
شرح
پوشه MyData حاوی یک پایگاه جغرافیایی به نام City.gdb با کلاسهای ویژگی bus_routes و bus_stops و shapefiles به نام services.shp، parks.shp و roads.shp در پوشه اصلی است.
درda.Walk()تابع را می توان به صورت زیر برای این ساختار اعمال کرد:
واردات کمان
walk = arcpy.da.Walk(“C:/MyData”)
برای dirpath، dirnames، نام فایل در walk:
چاپ (dirpath، dirname، نام فایل)
فضای کاری سطح بالا روی C:\MyData تنظیم شده است. آبرایحلقه برای تکرار روی آیتم ها در تاپل به دست آمده استفاده می شود. برای هر “سطح”،da.Walk()تابع فضای کاری، نام پوشه ها و نام فایل ها را به صورت زیر برمی گرداند:
C:/MyData [‘City.gdb’] [‘facilities.shp’، ‘parks.shp’، ‘roads.shp’]
C:\MyData\City.gdb [] [‘bus_routes’، ‘bus_stops’]
نتیجه را با دقت در نظر بگیرید. اولین “سطح” پوشه C:\MyData است. نتایج شامل فضای کاری (C:\MyData)، نام پوشه (City.gdb) و سه نام فایل (در این مورد، فایلهای شکل) است. در مرحله بعد، تابع به سطح بعدی پایین می رود که پایگاه جغرافیایی City.gdb است. نتیجه فضای کاری (C:\MyData\City.gdb)، بدون نام پوشه (از این رو لیست خالی) و دو نام فایل (کلاس های ویژگی پایگاه جغرافیایی، در این مورد) است.
برای ساختارهای پوشه پیچیده تر، نتایج حاصل ازda.Walk()خواندن تابع می تواند تا حدودی دشوار شود. مثال قبلی پوشه Project را همانطور که در شکل نشان داده شده است در نظر بگیرید.
شرح
پوشه پروژه حاوی زیرپوشه ای به نام Planning، با یک پایگاه جغرافیایی به نام Education.gdb، با کلاس های ویژگی به نام مدارس و واحدها است. زیرپوشه ای به نام Shapefiles، با فایل های shapefiles به نام های points.shp، parks.shp، و roads.shp. دو geodatabase به نام های City.gdb و Water.gdb در پوشه ریشه. و یک شکل فایل به نام boundaries.shp در پوشه ریشه.
نتیجه ازda.Walk()تابع با استفاده از پوشه C:\Project به عنوان آرگومان به صورت زیر است:
C:/پروژه [‘City.gdb’، ‘Planning’، ‘Shapefiles’، ‘Water.gdb’] [‘boundaries.shp’]
C:\Project\City.gdb [] [‘bus_routes’، ‘bus_stops’]
C:\Project\Planning [‘Education.gdb’] []
C:\Project\Planning\Education.gdb [] [‘schools’, ‘unit’]
C:\Project\Shapefiles [] [‘facilities.shp’، ‘parks.shp’، ‘roads.shp’]
C:\Project\Water.gdb [] [‘streams’, ‘monitoring’, ‘watershed’]
همه عناصر چاپ می شوند، از جمله تمام فضاهای کاری، پوشه ها و نام فایل ها، اما خواندن نتایج تا حدودی دشوار است. متداول تر است که روی یک کار خاص تمرکز کنید، مانند فهرست کردن تمام کلاس های ویژگی و مسیرهای فهرست آنها. درنوع دادهپارامتر ازda.Walk()تابع را می توان برای فیلتر کردن نتایج استفاده کرد. علاوه بر این، کد را می توان برای تکرار در لیست نام فایل ها تغییر داد و هر کلاس ویژگی را به طور جداگانه چاپ کرد، به شرح زیر:
واردات کمان
walk = arcpy.da.Walk(“C:/Project”)
برای dirpath، dirnames، نام فایل در walk:
برای فایل در نام فایل:
چاپ (فایل)
نتیجه به صورت زیر چاپ می شود:
مرزها.shp
مسیرهای اتوبوس
ایستگاه های اتوبوس
مدارس
واحدها
امکانات.shp
parks.shp
roads.shp
جریان ها
نظارت بر
حوزه های آبخیز
نام فایل های برگردانده شده توسطda.Walk()تابع فقط شامل نام پایه، بدون هیچ گونه جزء مسیر است. برای استفاده از نتایج در قسمت دیگری از اسکریپت، اغلب به مسیرهای کامل نیاز است. مسیر کامل را می توان با استفاده از آن اضافه کردos.path.join()و مسیر دایرکتوری:
واردات کمان
واردات سیستم عامل
walk = arcpy.da.Walk(“C:/Project”, datatype=”FeatureClass”)
برای dirpath، dirnames، نام فایل در walk:
برای فایل در نام فایل:
print(os.path.join(dirpath، فایل))
نتیجه به صورت زیر چاپ می شود:
C:/Project\boundaries.shp
C:\Project\City.gdb\bus_routes
C:\Project\City.gdb\bus_stops
C:\Project\Planning\Education.gdb\schools
C:\Project\Planning\Education.gdb\units
C:\Project\Shapefiles\facilities.shp
C:\Project\Shapefiles\parks.shp
C:\Project\Shapefiles\roads.shp
C:\Project\Water.gdb\streams
C:\Project\Water.gdb\monitoring
C:\Project\Water.gdb\watersheds
این مثال نشان می دهد که چگونهda.Walk()می تواند ساختارهای پوشه پیچیده را بدون نیاز به دانستن ماهیت دقیق فضاهای کاری از قبل هدایت کند. این تابع همچنین مجموعه داده های ویژگی را تشخیص می دهد. همانطور که در شکل نشان داده شده است، مثال قبلی geodatabase Transport.gdb را در نظر بگیرید.
شرح
پایگاه جغرافیایی حمل و نقل شامل مجموعه داده ویژگی به نام دوچرخه سواری، با کلاس های ویژگی به نام مسیرهای دوچرخه و گذرگاه ها است. و کلاس هایی به نام roads and traffic_lights را در ریشه پایگاه جغرافیایی مشخص کنید.
کد خواندن تمام کلاس های ویژگی در این پایگاه جغرافیایی به شرح زیر است:
واردات کمان
واردات سیستم عامل
walk = arcpy.da.Walk(“C:/Transit/Transportation.gdb”,
datatype=”FeatureClass”)
برای dirpath، dirnames، نام فایل در walk:
برای فایل در نام فایل:
print(os.path.join(dirpath، فایل))
نتیجه به صورت زیر چاپ می شود:
C:/Transportation.gdb\traffic_lights
C:/Transportation.gdb\roads
C:\Transportation.gdb\Cycling\bike_routes
C:\Transportation.gdb\Cycling\Cassings
این کد امکان لیست کردن تمام کلاس های ویژگی را بدون تنظیم فضای کاری به طور جداگانه برای هر مجموعه داده ویژگی فراهم می کند.
6.6استفاده از لیست ها دربرایحلقه ها
هنگامی که فهرستی از مقادیر دلخواه را دارید، می توانید از لیست برای پردازش دسته ای مجموعه داده های متعدد استفاده کنید. این پردازش معمولاً با استفاده از a انجام می شودبرایحلقه آبرایحلقه بر روی لیست، یک عنصر در یک زمان تکرار می شود. هنگامی که هیچ مقداری برای تکرار باقی نمانده است، حلقه به پایان می رسد. مثال قبلی استفاده ازda.Walk()قبلاً مثالی از استفاده از a را نشان می دهدبرایحلقه اگرچه این تابع یک تاپل را برمی گرداند، اما تکرار روی عناصر با استفاده از aبرایحلقه مشابه کار با لیست است. این بخش نگاه دقیق تری به تکرار با استفاده از آن داردبرایحلقه ها
به عنوان مثال، استفاده از a را در نظر بگیریدبرایحلقه با داده های شطرنجی کد به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data”
tifflist = arcpy.ListRasters(“”, “TIF”)
برای tiff در tifflist:
arcpy.BuildPyramids_management(tiff)
در این مثال،ListRasters()تابع برای ایجاد لیستی از فایل های TIFF استفاده می شود. دربرایحلقه روی هر عنصر در لیست تکرار می شود و برای هر شطرنجی هرم می سازد. این کد بسیار قدرتمند می شود زیرا می تواند کارهای نسبتاً خسته کننده را خودکار کند. به عنوان مثال، ساختن اهرام برای صدها شطرنجی ممکن است زمانبر شود. چند خط کد پایتون که در اینجا استفاده می شود برای انجام این کار کافی است و این کد چه تنها چند مجموعه داده شطرنجی یا چند صد نفری باشد، یکسان است.
به عنوان مثال دیگر، تکرار با استفاده از aبرایحلقه مورد استفاده در ترکیب باListFields()تابع شرح مفصلی از فیلدها و خواص آنها ارائه می دهد. کد زیر لیستی از فیلدها را در یک شکل فایل ایجاد می کند و سپس نام، نوع و طول هر فیلد را چاپ می کند:
واردات کمان
arcpy.env.workspace = “C:/Data”
fieldlist = arcpy.ListFields(“roads.shp”)
برای فیلد در لیست فیلد:
print(“{0} یک فیلد از نوع {1} با طول {2} است”.
قالب (فیلد. نام، فیلد. نوع، فیلد. طول))
لیست های پایتون اغلب برای خودکارسازی کارهای تکراری استفاده می شود. سناریویی را در نظر بگیرید که در آن داده های اصلی از چندین شکل فایل در یک پوشه تشکیل شده است. وظیفه شما این است که تمام شکل فایل ها را بخوانید و آنها را در یک پایگاه داده جغرافیایی موجود کپی کنید. در اینجا کد این کار است:
واردات کمان
واردات سیستم عامل
arcpy.env.workspace = “C:/Transportation”
outgdb = “C:/Transportation/City.gdb”
fcs = arcpy.ListFeatureClasses()
برای fc در fcs:
desc = arcpy.da.Describe(fc)
outfc = os.path.join(outgdb, desc[“baseName”])
arcpy.CopyFeatures_management(fc، outfc)
چند مشاهدات لازم است. یک شکل فایل دارای پسوند فایل .shp است. برای حذف این پسوند فایل،da.Describe()تابع را به دست می آوردنام پایهویژگی شکل فایل به عنوان مثال، برای یک شکل فایل به نام rivers.shp، theنام پایهویژگی rivers است و به عنوان نام کلاس ویژگی خروجی استفاده می شود. با این حال، ابزار Copy Features به مسیر کامل نیاز دارد – یعنی C:\Transportation\City.gdb\rivers. این مسیر کامل را می توان با استفاده ازos.path.join().
زمانی که پوشههای فرعی وجود دارند، رویکردی تا حدودی متفاوت مورد نیاز است. ساختار فایل زیر را در پوشه ای به نام City با زیرپوشه های حاوی shapefiles و پوشه ای به نام City_Copy با پایگاه داده جغرافیایی، همانطور که در شکل نشان داده شده است، در نظر بگیرید.
شرح
پوشه شهر حاوی یک زیرپوشه به نام Environment، با فایلهای شیپ به نام parks.shp و trails.shp است. زیر پوشه ای به نام Transportation، با فایل های شکل به نام bike_routes.shp، installation.shp، و roads.shp. یک زیر پوشه به نام Zoning، با یک شکل فایل به نام taxhounds.shp. و یک پوشه به نام City_Copy حاوی یک geodatabase خالی به نام Study.gdb.
وظیفه شما این است که تمام شکل فایل ها را در یک پایگاه داده جغرافیایی موجود کپی کنید. شکل فایل ها در پوشه های مختلف قرار دارند. این ساختار پوشه استفاده ازListFeatureClasses()عملکرد زیرا هر پوشه یک فضای کاری جداگانه است. درda.Walk()تابع یک راه جایگزین و کارآمدتر برای مکان یابی تمام فایل های شکل و کپی کردن آنها است. در اینجا کد این کار است:
واردات کمان
واردات سیستم عامل
فضای کاری = “C:/City”
outgdb = “C:/City_Copy/Study.gdb”
walk = arcpy.da.Walk (فضای کاری، نوع داده = “FeatureClass”)
برای dirpath، dirnames، نام فایل در walk:
برای فایل در نام فایل:
infc = os.path.join (dirpath، فایل)
desc = arcpy.da.Describe(infc)
outfc = os.path.join(outgdb, desc[“baseName”])
arcpy.CopyFeatures_management(infc, outfc)
کد از چندین جهت با راه حل قبلی متفاوت است. اولین،env.workspaceاستفاده نمی شود زیرا فضای کاری به صراحت در تنظیم شده استda.Walk()عملکرد. دوم، نام فایل های برگردانده شده توسطda.Walk()تابع شامل مسیر کامل نمی شود و در نتیجه مسیر کلاس های ویژگی ورودی باید با استفاده از آن ایجاد شودos.path.join().
نتیجه اسکریپت همانگونه که در شکل نشان داده شده است، یک کپی از تمام فایل های شکل در پایگاه داده های جغرافیایی هدف است.
توجه: پایگاه جغرافیایی مورد نظر باید در پوشهای باشد که جدا از فضای کاری مورد استفاده قرار گیردarcpy .da.Walk()عملکرد.
فصل های بعدی استفاده می شودبرایحلقه برای بسیاری از سناریوهای گردش کار دیگر.
6.7کار با لیست ها
لیست ها یک نوع داده همه کاره پایتون هستند که می توانند به روش های مختلف دستکاری شوند. اگرچه فهرستی از کلاسهای ویژگی، فیلدها یا رسترها با استفاده از یک تابع ArcPy ایجاد میشود، اما فهرست با استفاده از توابع و روشهای داخلی پایتون برای لیستها دستکاری میشود. در زیر چند نمونه از متداولترین توابع و روشهای داخلی استفاده میشود.
تعداد کلاس های ویژگی در یک فضای کاری را می توان با استفاده از پایتون داخلی تعیین کردlen()عملکرد. کد به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data/Example.gdb”
fcs = arcpy.ListFeatureClasses()
چاپ (لن (fcs))
برای یک پایگاه جغرافیایی با پنج کلاس ویژگی، این کد عدد 5 را چاپ می کند.
لیست ها را می توان با استفاده ازمرتب سازی()روش. مرتبسازی پیشفرض به ترتیب حروف عددی است، اما میتوان آن را با استفاده از عبارت معکوس کردمعکوساستدلال ازمرتب سازی()روش. کد زیر لیستی از کلاس های ویژگی ایجاد می کند، آنها را به صورت الفبایی مرتب می کند و نام آنها را چاپ می کند. سپس مرتبسازی معکوس میشود و نامها دوباره چاپ میشوند. کد به شرح زیر است:
واردات کمان
arcpy.env.workspace = “C:/Data/Example.gdb”
fcs = arcpy.ListFeatureClasses()
fcs.sort()
چاپ (fcs)
fcs.sort(reverse=True)
چاپ (fcs)
نتیجه برای یک پایگاه جغرافیایی با پنج کلاس ویژگی چیزی شبیه به زیر است:
[‘بیمارستان ها’، ‘پارک ها’، ‘جاده ها’، ‘رودخانه ها’، ‘تالاب ها’]
[‘تالاب ها’، ‘روی ها’، ‘جاده ها’، ‘پارک ها’، ‘بیمارستان ها’]
هنگام کار با فهرستهای کلاسهای ویژگی، جداول، فیلدها، رسترها یا دیگر انواع دادههای فضایی، میتوان از روشهای نمایهسازی، برش و فهرست استفاده کرد.
یک رویکرد اضافی برای کار با لیست ها، درک لیست نام دارد. درک لیست در پایتون روشی مختصر برای ایجاد یک لیست با تکرار روی یک شی قابل تکرار است. این نحو فشرده ای را ارائه می دهد که دقیقاً مانند یک استبرایحلقه مثال تعمیم یافته a را در نظر بگیریدبرایحلقه:
برای <item> در <list>:
<بیان>
معادل با استفاده از درک لیست است
[<expression> برای <item> در <list>]
نحو درک لیست از براکت استفاده می کند، به این معنی که نتیجه همیشه یک لیست است.
غیر معمولبرایحلقه را می توان به عنوان درک لیست بازنویسی کرد. کد زیر را در نظر بگیرید:
مربع = []
برای x در محدوده (6):
Squares.append(x * x)
چاپ (مربع)
نتیجه این است
[0، 1، 4، 9، 16، 25]
اسکریپت یک لیست خالی ایجاد می کند و دربرایحلقه، اعداد 0 تا 5 مربع می شوند و آن مقادیر به لیست اضافه می شوند. نتایج مشابهی را می توان با استفاده از یک خط کد با استفاده از درک لیست به دست آورد، به شرح زیر:
مربع = [x * x برای x در محدوده (6)]
چاپ (مربع)
در ادامه مثال دیگری از درک لیست معمولی است. در این مثال، هر یک از حروف موجود در لیست موجود به حروف کوچک تبدیل می شود و نتیجه یک لیست جدید با رشته های کوچک است:
old_list = [“G”، “I”، “S”]
newlist = [letter.lower() برای حرف در old_list]
چاپ (لیست جدید)
نتیجه این است
[‘g’، ‘i’، ‘s’]
درک لیست همچنین از استفاده از فیلتر عنصر با شرایط پشتیبانی می کند. شکل تعمیم یافته برای استفاده از چنین شرایطی است
[<expression> برای <item> در <list> if <condition>]
مثال زیر از درک لیست برای فیلتر کردن کاراکترهای یک رشته با ارزیابی رقم بودن آنها با استفاده ازisdigit()روش. نتیجه یک لیست جدید با تنها کاراکترهایی است که در واقع رقم هستند.
mystring = “این رشته 28 کاراکتر است”
رقم = [x برای x در mystring اگر x.isdigit()]
چاپ (اعداد)
نتیجه این است
[‘2’، ‘8’]
درک لیست را می توان در ترکیب با توابع لیست ArcPy استفاده کرد. اسکریپت زیر ازListFields()برای ایجاد لیستی از فیلدهای یک کلاس ویژگی. به یاد بیاورید کهListFieldsتابع لیستی ازرشتهاشیاء. شما می توانید لیستی از نام فیلدها را با تکرار روی آنها بدست آوریدرشتهاشیاء و با استفاده ازناماموال، به شرح زیر:
واردات کمان
fc = “C:/Data/Study.gdb/zones”
فیلد_نام = []
برای f در arcpy.ListFields(fc):
field_names.append(f.name)
چاپ (نامهای_فیلد)
همین کار را می توان با استفاده از درک لیست به شیوه ای مختصر تر انجام داد:
واردات کمان
fc = “C:/Data/Study.gdb/zones”
field_names = [f.name برای f در arcpy.ListFields(fc)]
چاپ (نامهای_فیلد)
این مثالها نشان میدهند که درک فهرست جایگزین مختصری برای معمولی استبرایحلقه ها اکثربرایحلقه ها را می توان به عنوان درک لیست بازنویسی کرد. پایتون نه تنها از درک لیست پشتیبانی میکند، بلکه دستوری مشابه برای مجموعهها و دیکشنریها دارد.
نکاتی که باید به خاطر بسپارید
- ArcPy شامل چندین عملکرد برای کاوش داده های مکانی است، از جمله بررسی وجود مجموعه داده ها و توصیف مجموعه داده ها در یک فضای کاری. فهرستهای مجموعههای داده معمولاً مورد استفاده قرار میگیرند زیرا به شما امکان میدهند تا روی عناصر تکرار کنید تا گردش کار را خودکار کنید.
- دروجود دارد()تابع تعیین می کند که آیا یک مجموعه داده وجود دارد یا خیر. درتوصیف کردن()وDescribe()توابع ویژگی های یک مجموعه داده را تعیین می کنند. این توابع تضمین می کنند که ورودی های یک اسکریپت با انتظارات مطابقت دارد.
- توابع فهرست پردازش دسته ای را تسهیل می کند. هنگامی که لیستی از عناصر ایجاد می شود، می توان یک اسکریپت طراحی کرد تا روی تمام عناصر موجود در لیست تکرار شود. به عنوان مثالListFeatureClasses()تابع لیستی از تمام کلاس های ویژگی در یک فضای کاری ایجاد می کند و aبرایحلقه روی تمام عناصر موجود در لیست تکرار می شود تا عملیات مشابهی را روی هر کلاس ویژگی انجام دهد. توابع لیست برای انواع مختلف عناصر، از جمله فضاهای کاری، فایل ها، مجموعه داده ها، کلاس های ویژگی، فیلدها، رسترها، جداول و موارد دیگر وجود دارد.
- هنگام کاوش داده ها، آگاهی از فضای کاری مورد استفاده و همچنین استفاده از فهرست و مسیرهای سیستم بسیار مهم است. توابع لیست عناصر داده را در فضای کاری فعلی برمی گرداند. چندین تابع را می توان برای کاوش دقیق مجموعه داده ها استفاده کرد، از جملهListWorkspaces()،ListDatasets()، وListFiles().
- فهرست کردن تمام عناصر داده با فرمت های مختلف داده و ساختارهای زیرپوشه پیچیده است. برای تسهیل کار با موقعیت های پیچیده تر، می توانید ازWalk()عملکرد “راه رفتن” به بالا و پایین در پوشه و ساختار پایگاه داده برای به دست آوردن تمام عناصر داخل یک پوشه.
- درک فهرست جایگزینی مختصر برای معمولی استبرایحلقه ها هنگام کار با لیست ها.
شرایط کلیدی
- مسیر کاتالوگ
- پویا (خاصیت)
- درک لیست
- مسیر سیستم
- عام
سوالات را مرور کنید
- شباهت ها و تفاوت های کلیدی بین چیستتوصیف کردن()وDescribe()کارکرد؟
- تفاوت بین مسیرهای سیستم و کاتالوگ و چگونگی تأثیر آنها بر کاوش داده ها در یک پوشه را توضیح دهید.
- هنگام استفاده ازListFeatureClasses()تابع، چگونه میدانید که آیا نتایج شما شامل شیپ فایلها یا کلاسهای ویژگی پایگاه جغرافیایی است یا هر دو؟
- استفاده ازWalk()برای فهرست کردن تمام عناصر داده در یک پوشه با ساختار زیرپوشه پیچیده.
- مثال هایی در مورد استفاده از الف بیاوریدبرایحلقه برای تکرار بر روی لیستی از عناصر داده برای انجام کارهای تکراری.
- درک لیست چیست و چه زمانی می خواهید از آن استفاده کنید؟
فصل 7
اشکال زدایی و مدیریت خطا
7.1معرفی
این فصل رویه های اشکال زدایی را مورد بحث قرار می دهد و مروری بر رایج ترین خطاهای پایتون ارائه می دهد. رویههای رسیدگی به خطا نیز مورد بحث قرار میگیرند، از جمله اینکه چگونه میتوان بیشترین بهره را بردسعی کنید-به جزبیانیه.
مهم نیست که چقدر در نوشتن کد دقت کنید، حتماً خطاهایی رخ می دهد. سه نوع اصلی خطا در پایتون وجود دارد: خطاهای نحوی، استثناها و خطاهای منطقی. خطاهای نحوی در وهله اول از اجرای کد جلوگیری می کند. هنگامی که یک استثنا رخ می دهد، یک اسکریپت اجرای midprocess را متوقف می کند. یک خطای منطقی به این معنی است که اسکریپت اجرا می شود اما نتایج نامطلوبی ایجاد می کند. خطاهای نحوی و استثناها با استراتژی هایی در مورد نحوه رسیدگی به آنها بررسی می شوند.
7.2کار با خطاهای نحوی
خطاهای نحویمربوط به املا، علائم نگارشی، تورفتگی و سایر قراردادهای زبان پایتون است. خطاهای نحوی رایج ناشی از غلط املایی کلمات کلیدی یا متغیرها، از دست دادن علائم نگارشی و تورفتگی ناسازگار است. ببینید آیا می توانید خطا را در کد زیر تشخیص دهید:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در fclist
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
کولون در انتهای خط اول ازبرایحلقه گم شده است هنگامی که می خواهید این کد را اجرا کنید، خطای نحوی زیر نمایش داده می شود:
SyntaxError: نحو نامعتبر است
IDEهای پایتون دارای فرآیندهای بررسی داخلی هستند که تا حدودی مانند یک غلطگیر املا در برنامههای پردازش کلمه کار میکنند. نمونه اسکریپت را در IDLE در نظر بگیرید.
شرح
پنجره اسکریپت در IDLE با همان کدی که در متن نوشته شده است – یعنی با یک دونقطه در انتهای خط اولبرایحلقه
از منوی بالا، روی Run > Check Module کلیک کنید. این فرآیند بدون اجرای کد یک بررسی نحوی انجام می دهد. یک کادر محاوره ای پاپ آپ ظاهر می شود که خطای نحوی را گزارش می کند.
شرح
کادر محاورهای بازشو به نام SyntaxError با پیامی مبنی بر گزارش ” نحو نامعتبر “.
در خود اسکریپت، محل خطای نحوی نیز به صورت نوار قرمز نشان داده شده است.
شرح
پنجره اسکریپت در IDLE با همان کد موجود در متن، که یک نوار افقی قرمز رنگ در انتهای خط 4 نشان می دهد تا محل خطای نحوی را نشان دهد.
بررسی خطا دقیقاً به شما نمی گوید که خطا چیست (یعنی یک دونقطه از دست رفته)، فقط محل خطای نحوی را نشان می دهد.
توجه داشته باشید:هیچ گزینه ای در IDLE برای نمایش اعداد خط در یک اسکریپت وجود ندارد، که این ویژگی معمولی برای اکثر ویرایشگرهای پایتون، از جمله Spyder و PyCharm است.
با تغییر خط 4 به کد زیر، خطای نحو برطرف می شود:
برای fc در fclist:
وقتی روی Run > Check Module کلیک می کنید، هیچ پیام خطایی ظاهر نمی شود و مترجم تعاملی باز می شود. این بدان معناست که اسکریپت آماده اجرا است.
بررسی خطای اصلی همچنین شامل تورفتگی و فاصله است. به عنوان مثال، بلوک کد زیر از تورفتگی ناسازگار استفاده می کند:
برای fc در fclist:
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
با بررسی این کد در IDLE پیام زیر تولید می شود:
SyntaxError: تورفتگی غیرمنتظره
اگر تورفتگی شما از ترکیبی از فاصله ها و زبانه ها استفاده کند، خطاهای مشابهی ممکن است رخ دهد. به خصوص هنگامی که از منابع دیگر مانند Microsoft Word، Microsoft PowerPoint یا Adobe PDF کپی می کنید، ممکن است بلوک های کد از نظر بصری به درستی تورفتگی داشته باشند اما ممکن است از ترکیبی از فضاها و برگه ها استفاده کنند.
توجه داشته باشید:اگرچه خطاهای تورفتگی محتمل ترین نوع خطا هنگام کپی کد از منابع دیگر مانند فایل های Word و PDF هستند، کپی کردن کد احتمالاً انواع دیگری از خطاها از جمله نقل قول ها را نیز معرفی می کند. بنابراین به طور کلی کپی کد از این نوع فایل ها توصیه نمی شود. اگر این کار را می کنید، حتماً تورفتگی، فاصله، ادامه خط و نقل قول را به دقت بررسی کنید.
سایر IDE ها عملکرد مشابهی برای بررسی نحوی اولیه دارند. به عنوان مثال، Spyder هنگام نوشتن اسکریپت خود، خطاهای نحوی را به طور خودکار نمایش می دهد. در مثال، یک نقطه قرمز کوچک با یک ضربدر سفید در سمت چپ شماره خط ظاهر می شود. با نگه داشتن ماوس روی این نماد، یک پنجره پاپ آپ با پیام “invalid syntax” ظاهر می شود.
شرح
پنجره اسکریپت در Spyder با همان کدی که در مثالهای قبلی وجود داشت، نشاندهنده یک نماد خطا در سمت چپ خط 4 و یک پنجره بازشو که “سینتکس نامعتبر” را گزارش میدهد.
به طور مشابه، تورفتگی ناسازگار یک پیام هشدار ایجاد می کند: “تورفتگی غیرمنتظره”. یکی از مزایای استفاده از ویرایشگری مانند Spyder این است که این خطاها و هشدارها بلافاصله هنگام نوشتن کد خود ظاهر می شوند که یک ابزار یادگیری عالی است.
شرح
پنجره اسکریپت در Spyder با همان کدی که در مثالهای قبلی وجود داشت، نشاندهنده یک علامت هشدار در سمت چپ خط 6 و یک پنجره بازشو که “تورفتگی غیرمنتظره” را گزارش میدهد.
بررسی خطای نحوی در PyCharm نیز با نوشتن کدتان انجام میشود، اما نمایشگر ظریفتر است. خطاهای نحوی به صورت یک خط قرمز قرمز نشان داده می شوند، همانطور که خطاهای املایی در Microsoft Word (در میان سایر برنامه ها) نشان داده می شوند. این می تواند نمایشگر را به سختی ببیند زیرا اغلب خطای نحوی تنها یک کاراکتر عرض دارد.
شرح
پنجره اسکریپت در PyCharm با همان کدی که در مثالهای قبلی وجود داشت، که یک خط قرمز قرمز را در انتهای خط اول نشان میدهد.برایحلقه
علاوه بر این، تم صفحه نمایش محبوب Darcula (پس زمینه تیره، کد روشن) تشخیص این رنگ ها را تا حدودی دشوار می کند. تم نمایش پیش فرض (پس زمینه روشن، کد تیره) استفاده شده در شکل ها معمولاً دیدن این رنگ ها را آسان تر می کند.
هنگامی که مکان نما خود را در نقطه خطای نحوی قرار می دهید، این خطا در گوشه سمت چپ پایین برنامه در نوار وضعیت ظاهر می شود. هنگامی که با مکان نما خود روی نقطه خطای نحو مکث می کنید، یک پنجره پاپ آپ با خطای نحو نیز ظاهر می شود.
شرح
پنجره اسکریپت در PyCharm با همان کدی که در مثالهای قبلی وجود داشت، یک پنجره بازشو با پیام «Colon expected» نشان میدهد.
تشخیص خطاهای نحوی هنگام نوشتن کد می تواند مفید باشد. علاوه بر این، PyCharm می تواند گزارشی با تمام خطاها و هشدارهای یک اسکریپت ایجاد کند. از منوی بالا، روی Code > Inspect Code کلیک کنید و سپس اسکریپت فعلی را انتخاب کنید. اسکریپت زیر را با دو خطای نحوی در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در fclist
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
بازرسی کد PyCharm نتایج نشان داده شده در شکل را ایجاد می کند.
نتایج بازرسی شامل دو خطای نحوی یک دونقطه از دست رفته و تورفتگی ناسازگار، اما همچنین چندین اخطار و مشکلات املایی است. اگرچه ممکن است این مشکلات توجه را جلب کند، اما مانع از اجرای کد نمی شود. برخی از اخطارها تکراری از خطاهای نحوی هستند، در حالی که برخی از مشکلات املایی مربوط به نام مجموعه داده ها و/یا متغیرهایی است که قوانین املایی معمولی برای آنها اعمال نمی شود.
یکی دیگر از ویژگی های مفید PyCharm در این زمینه این است که سازگاری داخلی نام متغیرها را بررسی می کند. کد زیر را در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در mylist:
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
هیچ مشکل نحوی وجود ندارد، اما متغیر استfclistدر خط 3 مقداری به آن اختصاص داده شده است و به اشتباه به آن اشاره می شودلیست مندر خط 4. نام این متغیر یک خطای نحوی نیست و مانع از اجرای کد نمی شود. با این حال، کد به درستی اجرا نمی شود زیرالیست منارزشی داده نشده است PyCharm این مشکل را به عنوان یک مرجع حل نشده گزارش می کند.
شرح
پنجره اسکریپت در PyCharm با همان کدی که در متن وجود دارد، یک پنجره بازشو با پیام “مرجع حل نشده “mylist” را نشان می دهد.
مانند خطاهای نحوی، بازخورد دقیقاً به شما نمی گوید که چگونه مشکل را برطرف کنید، اما شما را در جهت درست راهنمایی می کند. Spyder دارای همان ویژگی داخلی است و متغیر را علامت گذاری می کندلیست منبه عنوان یک “نام تعریف نشده”.
ویژگیهای داخلی بررسی کد مانند مواردی که توسط Spyder و PyCharm ارائه شدهاند، این ویرایشگرها را در مقایسه با IDLE که فقط خطاهای نحوی را تشخیص میدهد، همه کارهتر میکند.
7.3تشخیص استثناها
خطاهای نحوی ناامید کننده هستند، اما در مقایسه با سایر خطاها نسبتاً آسان به دست می آیند. مثال زیر را در نظر بگیرید که نحو تصحیح شده است:
واردات کمان
arcpy.env.workspace = “C:/Data/mydata.gdb”
fclist = arcpy.ListFeatureClasses()
برای fc در fclist:
count = arcpy.GetCount_management(fc)
چاپ (شمارش)
وقتی اسکریپت را دوباره اجرا می کنید، بدون خطای نحوی اجرا می شود. اما اگر تعداد چاپ نشده باشد چه؟ آیا این یک خطا است؟ شاید فضای کاری نادرست باشد یا شاید هیچ کلاس ویژگی در فضای کاری وجود نداشته باشد. شاید کلاس های ویژگی همه خالی باشند؟
زبانهای برنامهنویسی بهجای اشاره به این حوادث بهعنوان «خطا»، معمولاً بین روند عادی رویدادها و چیزهای استثنایی تشخیص میدهند. ممکن است خطاهایی وجود داشته باشد، یا ممکن است به سادگی رویدادهایی وجود داشته باشد که شما پیش بینی نکرده اید. این رویدادها استثنا نامیده می شوند. استثناها به خطاهایی اشاره دارند که در حین اجرای اسکریپت شناسایی می شوند. هنگامی که یک استثنا شناسایی می شود، اسکریپت اجرا نمی شود مگر اینکه استثنا به درستی مدیریت شود. به استثناها گفته میشود که «پرتاب میشوند»، همانطور که در «اسکریپت یک استثنا ایجاد میکند». اگر استثنا به درستی مدیریت شود – یعنی “گرفته شود” – برنامه می تواند به اجرا ادامه دهد. بخشهای بعدی این فصل نمونههایی از استثناها و تکنیکهای مناسب رسیدگی به خطا را ارائه میکنند.
7.4استفاده از اشکال زدایی
هنگامی که کد منجر به استثنا یا خطاهای منطقی می شود، ممکن است لازم باشد مقادیر متغیرهای موجود در اسکریپت خود را با دقت بیشتری بررسی کنید، که می تواند با استفاده از یک روش اشکال زدایی انجام شود. اشکال زدایی یک فرآیند روش شناختی برای یافتن خطاها در اسکریپت شما است. چندین روش ممکن برای اشکال زدایی وجود دارد، از ابتدایی تا پیچیده. روش های اشکال زدایی شامل موارد زیر است:
- بررسی دقیق محتوای پیام های خطا
- اضافه کردن پیام های چاپی به اسکریپت
- نظر دادن انتخابی کد
- استفاده از دیباگر پایتون
این بخش هر یک از این رویکردها را با جزئیات بیشتری بررسی می کند. به خاطر داشته باشید که در اکثر مواقع، اشکال زدایی به شما نمی گوید که چرا یک اسکریپت به درستی اجرا نمی شود، اما به شما می گوید که کجا – یعنی در کدام خط کد شکست خورده است. به طور معمول، شما هنوز هم باید بفهمید که چرا خطا رخ داده است.
بررسی دقیق محتوای پیام های خطا
پیام های خطای تولید شده توسط ArcPy معمولاً آموزنده هستند. به مثال زیر توجه کنید:
واردات کمان
arcpy.env.workspace = “C:/Data”
infcs = [“streams.shp”, “floodzone.shp”]
outfc = “union.shp”
arcpy.Union_analysis(infcs, outfc)
این اسکریپت یک اتحاد بین دو کلاس ویژگی ورودی انجام می دهد که به عنوان یک لیست وارد می شوند. نتیجه باید یک کلاس ویژگی خروجی جدید در همان فضای کاری باشد. پیام خطا به شرح زیر است:
ExecuteError: اجرا نشد. پارامترها معتبر نیستند
ERROR 000366: نوع هندسه نامعتبر است
اجرا نشد (Union).
به این پیغام خطای خاص که توسط ArcPy تولید میشود، anExecuteErrorاستثنا. پیام مفید است زیرا شامل متن استنوع هندسه نامعتبر است. بررسی دقیقتر کلاسهای ویژگی ورودی نشان میدهد که یکی از ورودیها (streams.shp) یک کلاس ویژگی چند خطی است و ابزار Union فقط با ویژگیهای چند ضلعی کار میکند. بنابراین، پیغام خطا دقیقاً به شما نمی گوید که چه چیزی اشتباه است (یعنی نمی گوید streams.shp از نوع هندسی polyline است و ابزار Union این نوع هندسی را نمی پذیرد)، اما شما را در جهت درست
هنگامی که یک کد خطای خاص در پیام خطا گنجانده شده است، مانند ERROR 000366، می توانید در راهنمای ArcGIS Pro درباره آن اطلاعات بیشتری کسب کنید. میتوانید با وارد کردن کد خطا یعنی «000366» معنای پیام خطا را جستجو کنید.
شرح
کد خطا شامل توضیحی است که می گوید نوع هندسه نامعتبر است و راه حلی برای بررسی اینکه کدام نوع هندسه برای عملیات پشتیبانی می شود و باید به عنوان ورودی استفاده شود.
همه پیام های خطا به این اندازه مفید نیستند. اسکریپت زیر را در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/mydata”
infcs = [“streams.shp”, “floodzone.shp”]
outfc = “union.shp”
arcpy.Union_analysis(infcs, outfc)
این اسکریپت مانند قبل است، اما از یک فضای کاری متفاوت (C:\mydata) استفاده می کند که وجود ندارد. پیام خطا در IDLE به شرح زیر است:
ردیابی (آخرین تماس اخیر):
فایل “C:\Data\myunion.py”، خط 5، در <module>
arcpy.Union_analysis(infcs, outfc)
فایل “C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\analysis.py” خط 737، در Union
بالا بردن e
فایل “C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\analysis.py” خط 734 در Union
retval = convertArcObjectToPythonObject(gp.Union_analysis(*gp_fixargs((in_features, out_feature_class, join_attributes, cluster_tolerance, gaps), True)))
فایل “C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\geoprocessing\_base.py”، خط 498، در <lambda>
برگردان لامبدا *args: val(*gp_fixargs(args، True))
arcgisscripting.ExecuteError: اجرا نشد. پارامترها معتبر نیستند
ERROR 000732: ویژگی های ورودی: جریان های مجموعه داده وجود ندارد یا پشتیبانی نمی شود
اجرا نشد (Union).
پیام خطا گمراه کننده است. به نظر می رسد نشان می دهد که خطا در خط 5 کد (جایی که اتحادیه انجام می شود) است و مشکلی در پارامترهای ابزار وجود دارد. خطا در واقع در خط 2 است، جایی که یک فضای کاری نامعتبر تعریف شده است، و پیام پارامتر نامعتبر از این واقعیت است که هیچ کلاس ویژگی از فضای کاری ناموجود بدست نمی آید. متأسفانه، توابع گزارش خطای داخلی همیشه پیام خطای خاص تری مانند «فضای کاری وجود ندارد» را گزارش نمی کنند.
بررسی دقیق پیام های خطا مفید است زیرا ممکن است پاسخی برای رفع مشکل داشته باشند. اما کورکورانه به آنها خیره نشوید زیرا ممکن است خطا چیز کاملاً متفاوتی باشد و پیام های خطا ممکن است گمراه کننده باشند.
اضافه کردن پیام های چاپی به اسکریپت
وقتی چندین خط کد حاوی ابزارهای پردازش جغرافیایی دارید، ممکن است همیشه مشخص نباشد که در کدام خط خطا رخ داده است. در چنین مواردی، چاپ پیام ها پس از هر ابزار پردازش جغرافیایی یا سایر مراحل مهم برای تأیید اجرای موفقیت آمیز آنها ممکن است مفید باشد. کد زیر را در نظر بگیرید:
واردات کمان
arcpy.env.overwriteOutput = درست است
arcpy.env.workspace = “C:/Data”
arcpy.Buffer_analysis(“roads.shp”، “buffer.shp”، “1000 METERS”)
چاپ (“بافر تکمیل شد”)
arcpy.Erase_analysis(“buffer.shp”، “zone.shp”، “erase.shp”)
چاپ (“پاک کردن کامل شد”)
arcpy.Clip_analysis(“erase.shp”، “wetlands.shp”، “clip.shp”)
چاپ (“کلیپ تکمیل شد”)
اگر یک پیام خطا رخ دهد، پیام های چاپی نشان می دهد که کدام مراحل تکمیل شده اند، صرف نظر از اینکه پیام خطا تا چه حد مرموز است. به احتمال زیاد می توان این خطا را در بلوک کد درست قبل از پیام چاپی که اجرا نشد ردیابی کرد.
چاپ همچنین برای بررسی مقادیر متغیرها در اسکریپت شما استفاده می شود. مثالی از فصل 6 را در نظر بگیرید که در آن یک اسکریپت برای کپی کردن فایل های شکل موجود در یک فضای کاری در یک پایگاه داده جغرافیایی استفاده می شود:
واردات کمان
واردات سیستم عامل
arcpy.env.workspace = “C:/Transportation”
outgdb = “C:/Transportation/City.gdb”
fcs = arcpy.ListFeatureClasses()
برای fc در fcs:
desc = arcpy.da.Describe(fc)
outfc = os.path.join(outgdb, desc[“baseName”])
arcpy.CopyFeatures_management(fc، outfc)
اگر کلاسهای ویژگی خروجی ایجاد نشده باشند، اما اجرای اسکریپت هیچ خطای معنیداری ایجاد نکند، چه؟ مسیرها و نام فایل ها یک مشکل رایج هستند، بنابراین یکی از مواردی که می توانید امتحان کنید این است که مقادیر کلاس های ویژگی خروجی را به عنوان چک چاپ کنید. به طور معمول، بقیه اسکریپت را نظر می دهید تا فقط روی نام مسیر و فایل تمرکز کنید:
واردات کمان
واردات سیستم عامل
arcpy.env.workspace = “C:/Transportation”
outgdb = “C:/Transportation/City.gdb”
fcs = arcpy.ListFeatureClasses()
برای fc در fcs:
desc = arcpy.da.Describe(fc)
outfc = os.path.join(outgdb, desc[“baseName”])
چاپ (outfc)
##arcpy.CopyFeatures_management(fc, outfc)
پرینت چیزی شبیه به این خواهد بود:
C:/Transportation/City.gdb\arterials
C:/Transportation/City.gdb\bike_routes
ج:/Transportation/City.gdb\major_roads
چاپ به شما اجازه می دهد تا تأیید کنید که مقادیر مطابق انتظار هستند و می توانید تلاش خود را بر روی سایر مسائل احتمالی در مورد اسکریپت متمرکز کنید.
افزودن پیامهای چاپی میتواند مؤثر باشد، اما زمانی مفید هستند که از قبل ایده خوبی در مورد آنچه ممکن است باعث ایجاد خطا شده باشد، داشته باشید. یکی از معایب چاپ پیام ها این است که پس از رفع خطا باید پاک شوند، که می تواند کار قابل توجهی باشد.
نظر دادن انتخابی کد
نظر دادن انتخابی کد شامل حذف خطوط خاصی است تا ببینید آیا این خطا را از بین می برد یا خیر. فیلمنامه در بخش قبلی قبلاً نمونه ای از این رویکرد را نشان می داد. اگر اسکریپت شما یک گردش کار متوالی معمولی دارد، می توانید از پایین به بالا کار کنید. به عنوان مثال، کد زیر نشان می دهد که چگونه خطوط پایین کد با استفاده از علائم دو عددی (#) برای جداسازی خطا توضیح داده می شوند:
واردات کمان
arcpy.env.overwriteOutput = درست است
arcpy.env.workspace = “C:/Data”
arcpy.Buffer_analysis(“roads.shp”، “buffer.shp”، “1000 METERS”)
##arcpy.Erase_analysis(“buffer.shp”، “streams.shp”، “erase.shp”)
##arcpy.Clip_analysis(“erase.shp”، “wetlands.shp”، “clip.shp”)
میتوانید با دوبار تایپ علامت عددی در ابتدای یک خط کد، بهصورت دستی نظر دهید. IDE های پایتون همچنین دارای عملکرد داخلی برای این کار هستند، بنابراین می توانید چندین خط کد را در یک مرحله نظر دهید. به عنوان مثال، در IDLE، یک یا چند خط را برجسته کرده و روی Format > Uncomment Region کلیک کنید.
توجه داشته باشید:
قبل از نظرات در کد علامت عدد وجود دارد که به آن “علامت هش” نیز گفته می شود. هر خطی که با یک یا چند علامت # شروع شود اجرا نمی شود. یک علامت # منفرد معمولاً برای نظرات دائمی توسط نویسنده اسکریپت برای توضیح چیزی در مورد کد استفاده میشود، در حالی که نماد # دوتایی برای نظر دادن موقت خطوط کد در طول فرآیند آزمایش استفاده میشود.
مانند چاپ پیامها، نظر دادن خطوط کد دلیل رخ دادن خطا را مشخص نمیکند، بلکه فقط به شما کمک میکند تا جایی که رخ میدهد را جدا کنید.
استفاده از دیباگر پایتون
روش دیگر و سیستماتیک تر برای اشکال زدایی کد، استفاده از دیباگر پایتون است. دیباگر ابزاری است که به شما امکان می دهد خط به خط کد خود را طی کنید، نقاط شکست را در کد خود قرار دهید تا شرایط را در آن نقطه بررسی کنید و نحوه تغییر متغیرهای خاص را در سراسر کد خود دنبال کنید. پایتون یک بسته دیباگر داخلی به نام داردپی دی بی. استفاده از آن می تواند دشوار باشد زیرا فاقد رابط کاربری است و فقط از طریق خط فرمان قابل استفاده است. با این حال، ویرایشگرهای پایتون مانند IDLE، Spyder و PyCharm دارای یک محیط اشکال زدایی هستند که استفاده از آن آسان تر است. در مثال زیر از دیباگر IDLE استفاده شده است. این دیباگر عملکرد اولیه ای را ارائه می دهد که برای نشان دادن نحوه عملکرد اشکال زدایی کافی است.
یک روش اشکال زدایی معمولی به شرح زیر است:
- هر گونه خطای نحوی را بررسی کنید و اسکریپت را ذخیره کنید.
- نقاط شکست را تنظیم کنید، به شما امکان می دهد اجرای اسکریپت را در خطوط خاصی متوقف کنید.
- اسکریپت را با استفاده از دیباگر اجرا کنید.
- از طریق اسکریپت قدم بردارید و مراقب مقادیر متغیرهای مربوطه باشید.
اسکریپتی که قبلاً در این بخش استفاده شده بود در اینجا برای نشان دادن این مراحل استفاده می شود. ابتدا یک بررسی برای تعیین هر گونه مشکل نحوی اجرا می شود. پس از بررسی نحو، نقاط شکست در اسکریپت تنظیم می شود. اشکال زدایی از طریق خط به خط یک اسکریپت کار می کند، اما این فرآیند می تواند دست و پا گیر باشد. نقاط شکست به صورت دستی در نقاط خاصی از اسکریپت تنظیم می شوند. دیباگر تا رسیدن به نقطه شکست اجرا می شود. برای تنظیم نقاط شکست در یک اسکریپت در IDLE، مکان نما را در خط مورد نظر قرار دهید، کلیک راست کرده و روی تنظیم نقطه شکست کلیک کنید. خط با نقطه شکست زرد می شود. در اسکریپت مثال، نقاط شکست روی خطوط بابرایحلقه و با مسیر و نام فایل برای کلاس ویژگی خروجی.
شرح
پنجره اسکریپت در IDLE با همان کد در متن، با خطوط 6 و 8 که با رنگ زرد برجسته شده اند تا نقاط شکست را نشان دهند.
با تنظیم نقاط شکست، می توانید دیباگر را راه اندازی کنید. در IDLE، شما از پوسته پایتون (یا پنجره تعاملی) شروع می کنید، نه از پنجره اسکریپت. اگر پوسته پایتون قابل مشاهده نیست، از منوی بالا در پنجره اسکریپت، روی Run > Python Shell کلیک کنید. از منوی بالایی در Python Shell، روی Debug > Debugger کلیک کنید. در زیر فرمان، پیام [DEBUG ON] چاپ می شود.
در همان زمان، پنجره Debug Control باز می شود.
همه کنترل ها کم نور هستند، زیرا اسکریپت هنوز اجرا نشده است. برای شروع اشکال زدایی، به پنجره اسکریپت برگردید و اسکریپت را طبق معمول اجرا کنید. از آنجایی که شما آن را در حالت اشکال زدایی اجرا می کنید، تنها خط اول اسکریپت اجرا می شود. پنجره Debug Control باز می شود و شرایط بعد از اولین خط کد را نشان می دهد.
مراحل بعدی در فرآیند اشکال زدایی از پنجره Debug Control کنترل می شود. روی دکمه Go کلیک کنید تا اسکریپت تا اولین نقطه شکست اجرا شود. این مرحله شرایط متغیرهای آن خط در اسکریپت را نشان می دهد.
پنجره Debug Control مکان نقطه شکست (یعنی خط 6 در اسکریپت) را تأیید می کند و متغیرهای مهم را نشان می دهد. در این حالت مقدار متغیر fcs را به صورت زیر نشان می دهد:
[‘arterials.shp’، ‘bike_routes.shp’، ‘major_roads.shp’]
این نتیجه به سادگی تأیید می کند که به متغیر یک مقدار معنی دار اختصاص داده شده است – در این مورد، لیستی از رشته ها که به کلاس های ویژگی در فضای کاری اشاره می کنند. برای مشاهده تمام متغیرها می توانید در پانل پایین کادر محاوره ای اسکرول کنید. این لیست نه تنها شامل متغیرهایی است که در اسکریپت ایجاد کرده اید، بلکه مواردی مانند ماژول های خاص مورد استفاده و مسیرهای آنها را نیز شامل می شود.
دوباره روی Go کلیک کنید تا کد تا نقطه شکست بعدی اجرا شود. این بار متغیر fc اضافه می شود و حاوی مقدار اولین عنصر از لیست کلاس های ویژگی است. دوباره روی Go کلیک کنید و مسیر کامل کلاس ویژگی خروجی نشان داده می شود.
با هر مرحله ای که در ادامه می آید، مقادیر fc و outfc به عنصر بعدی در لیست به روز می شوند. به طور موثر، شما در حال گذر از آن هستیدبرایحلقه یک تکرار در یک زمان. این روش روشی مؤثر برای تأیید درستی کارکرد تکرار است.
پس از تکمیل تمام نقاط شکست، دیباگر متوقف می شود و گزینه های موجود در پنجره Debug Control دوباره کم نور می شوند.
چندین گزینه دیگر به عنوان بخشی از فرآیند اشکال زدایی در IDLE وجود دارد. ابزار Step به شما این امکان را می دهد که خط به خط اسکریپت را بدون پرش به نقاط شکست مشخص شده طی کنید. ابزارهای Over و Out به شما این امکان را می دهند که در صورت لزوم از جلو پرش کنید. برای مثال، اگر خط فعلی کد حاوی فراخوانی به یک ماژول، تابع یا متد دیگر باشد، استفاده از ابزار Step منجر به ورود به آن رویه میشود. با استفاده از ابزار Over، خط کد را بدون وارد شدن به آن رویه اجرا میکنید—شما در حال «گذر از» جزئیات آن رویه هستید. هنگامی که وارد یک رویه میشوید، میتوانید از ابزار Out برای خارج شدن از رویه استفاده کنید، بدون اینکه از بقیه خطوط کد عبور کنید. این ویژگی به شما این امکان را می دهد که سریع به جلو بروید و به خط بعدی کد که رویه نامیده می شود بازگردید. بطور کلی، قدم زدن خط به خط اسکریپت شما ضروری نیست و در واقع می تواند کدهایی را از ماژول های مورد استفاده که معمولاً نیازی به نگاه کردن به آنها نیست، بیاورد. بنابراین استفاده از نقاط شکست انتخابی به شدت توصیه می شود.
در نهایت، ابزار Quit اشکال زدایی اسکریپت فعلی را به پایان می رساند، اما حالت اشکال زدایی روشن باقی می ماند. برای توقف کامل اشکال زدایی، از منوی بالای پوسته پایتون، روی Debug کلیک کنید و تیک Debugger را بردارید. این مرحله [DEBUG OFF] را در زیر فرمان چاپ می کند.
روش های اشکال زدایی در Spyder و PyCharm به روشی مشابه کار می کنند، اگرچه عملکرد رابط کمی متفاوت است. در Spyder، منوی کشویی Debug از منوی اصلی گزینه هایی را برای تنظیم نقاط شکست به شما می دهد.
از همان منو، روی Debug کلیک کنید تا اشکال زدایی شروع شود، و روی Continue کلیک کنید تا به نقطه شکست بعدی بروید.
در طول اشکال زدایی، می توانید متغیرها و مقادیر آنها را در پنجره کاوشگر متغیر در سمت راست بالا مشاهده کنید. به جای استفاده از رابط کاربری گرافیکی برای اشکال زدایی، می توانید از دیباگر IPython نیز استفاده کنیدipdbدر کنسول پایتون
در PyCharm، میتوانید با کلیک کردن در کنار شماره خط، یعنی بین شماره خط و کد، نقاط شکست را اضافه کنید.
برای شروع اشکال زدایی، از منوی بالا روی Run > Debug کلیک کنید. این مرحله پنجره Debug Tool را در پانل پایین نمایش می دهد. این پنجره مجموعه کاملی از کنترل ها را برای اشکال زدایی، از جمله نوار ابزارها و پنجره های مختلف برای ردیابی متغیرها ارائه می دهد.
بررسی دقیق روش های اشکال زدایی با استفاده از Spyder و PyCharm خارج از محدوده این فصل است. PyCharm مخصوصاً شامل بسیاری از گزینههای مختلف برای اشکالزدایی میشود، و این موارد به تفصیل در مستندات آنلاین PyCharm توضیح داده شدهاند. اگرچه این ابزارها قدرتمند هستند، اما یادگیری این ابزارها زمان می برد. برای خودکارسازی وظایف پردازش جغرافیایی برای اسکریپتهای مستقل نسبتاً ساده، استفاده از بررسی نحو و ابزارهای Inspect Code در PyCharm اغلب کافی است.
7.5استفاده از نکات و ترفندهای رفع اشکال
در زیر چند نکته و ترفند کلی برای کمک به اشکال زدایی اسکریپت های خود آورده شده است:
- به یاد داشته باشید که ArcGIS Pro اغلب یک قفل را روی یک فایل قرار می دهد، که ممکن است مانع از بازنویسی فایل توسط یک اسکریپت شود. اگر ArcGIS Pro را برای بازبینی نتایج خود باز دارید، ممکن است لازم باشد برنامه ArcGIS Pro را ببندید تا قفل ها آزاد شوند.
- هنگام کار با فایل های حجیم، ابتدا کد خود را روی یک فایل کوچک با ویژگی های مشابه امتحان کنید.
- برای تکرار در لیست های طولانی، اضافه کردن شمارنده برای پردازش فقط تعداد کمی از عناصر را در نظر بگیرید تا مطمئن شوید که کد قبل از پردازش کل لیست به درستی کار می کند.
- با درج پیام های چاپی یا تعیین نقاط شکست در کد به عنوان بخشی از یک روش رسمی اشکال زدایی، مراقب نحوه تغییر مقادیر متغیرها باشید.
- نقاط انفصال را در داخل بلوک های کد قرار دهید که باید تکرار شود.
- اگر ویرایشگر پایتون شما در حین دیباگ کردن متوقف نشد، می توانید کد را با استفاده از Ctrl + C روی صفحه کلید خود قطع کنید. برخی از ویرایشگرهای پایتون، از جمله Spyder و PyCharm، یک دکمه Stop واقعی دارند.
7.6رسیدگی به خطا برای استثناها
اگرچه روشهای اشکال زدایی میتواند به نوشتن کد صحیح کمک کند، خطاهای استثنا همچنان در اسکریپتهای شما رخ میدهد. استثناها به خطاهایی اشاره دارند که در حین اجرای اسکریپت شناسایی می شوند. یکی از دلایل کلیدی برای استثناها این است که بسیاری از اسکریپت ها به ورودی های کاربر متکی هستند و شما همیشه نمی توانید ورودی های ارائه شده توسط سایر کاربران را کنترل کنید. بنابراین، اسکریپتهای خوب نوشته شده شامل رویههای رسیدگی به خطا برای رسیدگی به استثناها هستند. رویه های رسیدگی به خطا برای جلوگیری از شکست اسکریپت و عدم ارائه بازخورد معنی دار نوشته شده اند.
برای رسیدگی به استثناها، می توانید از عبارات شرطی برای بررسی سناریوهای خاص استفاده کنیداگربیانیه. شما قبلاً در فصل های قبلی با برخی از آنها روبرو شده اید. به عنوان مثال، وجود یک مسیر را می توان در پایتون با استفاده از یک تابع داخلی پایتون مانندos.path.exists(). برای مسیرهای کاتالوگ می توانید ازوجود دارد()تابع ArcPy برای تعیین اینکه آیا مجموعه داده وجود دارد یا خیر. به عنوان مثال، کد زیر تعیین می کند که آیا یک شکل فایل وجود دارد یا خیر:
واردات کمان
arcpy.env.workspace = “C:/Data”
shape_exists = arcpy.Exists(“streams.shp”)
چاپ (شکل_وجود دارد)
دروجود دارد()تابع را می توان برای کلاس های ویژگی، جداول، مجموعه داده ها، شکل فایل ها، فضاهای کاری، لایه ها و فایل های موجود در فضای کاری فعلی استفاده کرد. تابع یک مقدار بولی برمی گرداند که نشان می دهد آیا عنصر وجود دارد یا خیر.
علاوه بر تعیین اینکه آیا داده وجود دارد یا خیر، میتوانید با استفاده از این نوع دادهها را تعیین کنیدتوصیف کردن()وda.Describe()توابع ArcPy به عنوان مثال، اگر اسکریپت شما به یک کلاس ویژگی نیاز دارد، می توانید از آن استفاده کنیدنوع دادهویژگی برای تعیین اینکه آیا یک کلاس ویژگی است یا چیز دیگری.
نوشتن عبارات شرطی برای بسیاری از خطاهای احتمالی خسته کننده است. و پیش بینی هر خطایی غیرممکن است. در کد مثال قبلی در این بخش، باید موارد زیر را بررسی کنید: (1) آیا فضای کاری معتبر است، (2) آیا حداقل یک کلاس ویژگی در فضای کاری وجود دارد، و (3) آیا یک ویژگی وجود دارد یا خیر. کلاس با حداقل یک ویژگی این بررسی ها به راحتی می توانند کد موجود در اسکریپت را دو برابر کنند.
دو استراتژی برای بررسی خطاها و گزارش آنها به شیوه ای معنی دار وجود دارد:
- از اشیاء استثنای پایتون در داخل استفاده کنیدسعی کنید-به جزبیانیه.
- پیام ها را با استفاده از عملکردهای پیام رسانی ArcPy گزارش دهید.
یک جایگزین قدرتمند برای دستورات شرطی، استفاده از اشیاء استثنای پایتون است. وقتی پایتون با خطایی مواجه میشود، یک استثنا ایجاد میکند یا یک استثنا ایجاد میکند، که معمولاً به این معنی است که اسکریپت اجرا نمیشود. اگر چنین شی استثنایی مدیریت نشود، که به آن catch یا trapped نیز گفته می شود، اسکریپت با یک خطای زمان اجرا خاتمه می یابد، که گاهی اوقات به عنوان یک ردیابی نامیده می شود.
مثال ساده تلاش برای تقسیم بر صفر را در نظر بگیرید. در پنجره پایتون، همانطور که در شکل نشان داده شده است، یک خطای زمان اجرا ایجاد می شود.
بخشهای زیر نشان میدهد که چگونه استثناها مطرح میشوند و چگونه این مواردسعی کنید-به جزبیانیه به طور موثر خطاها را به دام می اندازد.
7.7بالا بردن استثناها
همانطور که در مثالهای بخشهای قبلی نشان داده شده است، هنگامی که هنگام اجرای یک اسکریپت مشکلی پیش بیاید، استثناها بهطور خودکار مطرح میشوند. شما همچنین می توانید استثناهایی را با استفاده از آن مطرح کنیدبالا بردنبیانیه. به عنوان مثال، شما می توانید یک استثنا عمومی با استفاده ازبالا بردن استثنابیانیه به شرح زیر
بالا بردن استثنا
نتیجه این عبارت چیزی شبیه به زیر است:
ردیابی (آخرین تماس اخیر):
فایل “<string>”، خط 1، در <module>
استثنا
توجه داشته باشید:در مثال های زیر،ردیابیبخشی از پیام خطا حذف می شود و فقط آخرین خط نشان داده می شود.
همچنین می توانید یک پیام خاص به شرح زیر اضافه کنید:
افزایش استثنا (“فضای کاری نامعتبر”)
نتیجه این بیانیه:
استثنا: فضای کاری نامعتبر
انواع مختلفی از استثناها وجود دارد. شما می توانید آنها را با وارد کردن مشاهده کنیدساخته شدهماژول و با استفاده ازdir()تابع فهرست کردن همه آنها به شرح زیر است:
توده های وارداتی
dir (ساختمان ها)
اجرای این کد منجر به چاپ طولانی می شود (در اینجا به طور کامل نشان داده نشده است):
[‘ArithmeticError’، ‘AssertionError’، ‘AttributeError’، ‘BaseException’، ‘BlockingIOError’، ‘BrokenPipeError’، ‘BufferError’، ‘BytesWarning’ …]
توجه داشته باشید که این کد سایر عناصر را نیز چاپ می کندساخته شدهماژول، شامل تمام توابع داخلی و ثابت است، اما استثناها ابتدا چاپ می شوند.
هر یک از این استثناها را می توان دربالا بردنبیانیه. مثلا:
افزایش ValueError
نتیجه این بیانیه:
ValueError
این مثال یک استثنا با نام است – یعنی استثنا خاص با نام خوانده می شود. استثناهای نامگذاری شده به یک اسکریپت اجازه می دهد تا استثناهای خاص را به روش های مختلف مدیریت کند، که می تواند مفید باشد. با استفاده از عمومیاستثنابه عنوان یک استثنای بی نام شناخته می شود.
شرح کاملی از استثناهای داخلی پایتون را می توان در اسناد پایتون یافت. در مستندات، به مرجع کتابخانه بروید و بخش «استثناهای داخلی» را مرور کنید. اسناد همچنین سلسله مراتبی از خطاها را نشان می دهد: به عنوان مثال،ZeroDivisionErrorیکی از چندین نوع خطای حسابی است (خطای حسابی).
7.8رسیدگی به استثنائات
استثناها در یک اسکریپت را می توان با استفاده از a کنترل کرد – یعنی گرفتار یا به دام افتادسعی کنید-به جزبیانیه. هنگامی که یک استثنا به درستی مدیریت می شود، اسکریپت یک خطای زمان اجرا ایجاد نمی کند، بلکه پیام خطای معنی داری را به کاربر گزارش می دهد. اسکریپت تمام می شود و در صورت بروز خطا، پیام های اطلاعاتی را گزارش می دهد.
اسکریپت زیر را در نظر بگیرید که دو عدد ارائه شده توسط کاربر را تقسیم می کند:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
اسکریپت تا زمانی که صفر (0) به عنوان عدد دوم وارد شود، به خوبی کار می کند و در نتیجه پیام خطای زیر را ایجاد می کند:
ZeroDivisionError: تقسیم بر صفر
درسعی کنید-به جزدستور این استثنا را به دام می اندازد و مدیریت خطای اضافی را به شرح زیر ارائه می دهد:
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
به جز ZeroDivisionError:
print (“عدد صحیح دوم نمی تواند صفر باشد.”)
به ساختار آن توجه کنیدسعی کنید-به جزبیانیه. خط اول کد فقط از کد تشکیل شده استتلاش كردنبیانیه و به دنبال آن دو نقطه. بعد یک بلوک از کد تورفتگی با رویه ای است که می خواهید انجام دهید. سپس می آیدجزعبارت، که شامل یک استثنا خاص و به دنبال آن یک دو نقطه است. بعد یک بلوک از کد تورفتگی است که اگر استثنای خاص مطرح شود، اجرا می شود. استثناZeroDivisionErrorیک استثنا با نام است، به این معنی که داخلی است.
در این مثال یک سادهاگراین عبارت ممکن است به همان اندازه برای تعیین اینکه آیا مقدار y صفر است (0) موثر بوده است. با این حال، برای کد دقیق تر، ممکن است به بسیاری از این کدها نیاز داشته باشیداگربیانیه ها و تکسعی کنید-به جزبیانیه برای به دام انداختن خطا کافی است.
چندگانهجزعبارات می توانند استثناهای نامگذاری شده مختلف را بگیرند. مثلا:
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
به جز ZeroDivisionError:
print (“عدد صحیح دوم نمی تواند صفر باشد.”)
به جز ValueError:
print (“فقط اعداد صحیح ورودی های معتبر هستند.”)
شما همچنین می توانید چندین استثنا را با یک بلوک کد با مشخص کردن آنها به صورت یک تاپل به صورت زیر بدست آورید:
به جز (ZeroDivisionError، ValueError):
چاپ (“نوشته های شما معتبر نبودند.”)
در این حالت رسیدگی به خطا مختص نوع استثنا نیست و صرف نظر از اینکه کدام یک از این دو خطا باعث استثنا شده است فقط یک پیام چاپ می شود. پیام خطا، در این مورد، کمتر خاص است زیرا چندین استثنا را توصیف می کند. اگرچه ترکیب استثناها به این روش کد شما را کوتاهتر میکند، معمولاً استثناهای خاصتری ترجیح داده میشوند.
خود شیء استثنا نیز می تواند با ارائه یک آرگومان اضافی فراخوانی شود:
به جز (ZeroDivisionError، ValueError) به عنوان e:
چاپ (ه)
اجرای این کد به شما این امکان را می دهد که خود شی استثنا را بگیرید و می توانید به جای چاپ یک پیام خطای سفارشی، آن را چاپ کنید تا ببینید چه اتفاقی افتاده است.
گاهی اوقات پیش بینی همه انواع استثناهایی که ممکن است رخ دهد دشوار است. به خصوص در اسکریپتی که به ورودی کاربر متکی است، ممکن است نتوانید تمام سناریوهای ممکن را پیش بینی کنید. بنابراین، برای گرفتن همه استثناها، صرف نظر از نوع، می توانید به سادگی استثنای خاص را حذف کنیدجزبیانیه به شرح زیر
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
به جز استثنا به عنوان e:
چاپ (ه)
در این مثال، استثنا بدون نام است.
ممکن است تعجب کنید که این تفاوت با عدم استفاده ساده از aسعی کنید-به جزبیانیه و اجازه رخ دادن خطا، و در نتیجه یک پیام خطا. تفاوت اصلی این است که وقتی از aسعی کنید-به جزبیانیه، اسکریپت به طور معمول ادامه می یابد و به پایان می رسد. اگر خطا به دام نیفتد، اسکریپت در اواسط فرآیند متوقف می شود. بنابراین، با یکسعی کنید-به جزهر کدی که از آن پیروی می کند، بدون توجه به خطا، همچنان اجرا می شود، در حالی که خطایی که به دام نیفتد منجر به خاتمه اسکریپت قبل از اجرای آن قسمت از کد می شود. بنابراین، به دام انداختن خطاها منجر به اسکریپت های قوی تر و کاربر پسندتر می شود.
درسعی کنید-به جزبیانیه همچنین می تواند شامل یکدیگربیانیه که مانند یک عبارت شرطی است. مثلا:
در حالی که درست است:
تلاش كردن:
x = ورودی (“عدد صحیح اول:”)
y = ورودی (“عدد صحیح دوم:”)
چاپ (int(x)/int(y))
جز:
چاپ (“لطفا دوباره امتحان کنید.”)
دیگر:
زنگ تفريح
در این مثال،تلاش كردنبلوک کد در یک تکرار می شوددر حالی کهحلقه زمانی که یک استثنا مطرح می شود. حلقه توسطزنگ تفريحبیانیه دردیگرمسدود کردن فقط زمانی که هیچ استثنایی مطرح نشده باشد. اگر کاربر مقادیر نامعتبری مانند یک رشته، یک شناور یا مقدار 0 را برای ورودی دوم وارد کند، اسکریپت خطایی ایجاد نمی کند اما از کاربر می خواهد دوباره امتحان کند. اسکریپت تنها زمانی نتیجه را چاپ می کند که ورودی های معتبر ارائه شود.
یک اضافه دیگر بهسعی کنید-به جزبیانیه استسرانجامبیانیه. نتیجه قبلی هر چه باشدتلاش كردن،جز، یادیگربلوک های کد،سرانجامبلوک کد همیشه اجرا می شود. این بلوک معمولاً شامل وظایف پاکسازی است و میتواند شامل بررسی مجوزها یا حذف ارجاع به فایلها باشد.
به جای استفاده از یکی از استثناهای نامگذاری شده موجود، می توانید استثناهای خود را نیز ایجاد کنید. کد مثال زیر را در نظر بگیرید که در آن از کاربر خواسته میشود یک رمز عبور جدید ارائه دهد و اسکریپت بررسی میکند که آیا ورودی حداقل شش کاراکتر داشته باشد یا خیر:
تلاش كردن:
رمز عبور = ورودی (“یک رمز عبور جدید وارد کنید:”)
اگر لنز (رمز عبور) > 5:
print (“رمز عبور شما به اندازه کافی طولانی است.”)
دیگر:
افزایش ValueError
به جز ValueError:
print (“رمز عبور شما خیلی کوتاه است.”)
استثنای نام برده شدهValueErrorدر اینجا استفاده می شود، اما بررسی های مشابه دیگری نیز وجود دارد که می توان انجام داد، از جمله کاراکترهای مجاز، استفاده از حروف بزرگ و کوچک، استفاده از ترکیبی از حروف و اعداد و غیره. هر یک از این خطاها نیز یک خواهد بودValueErrorاستثنا. بنابراین وجود یک استثنا خاص برای مواردی که رمز عبور خیلی کوتاه است مفید خواهد بود. این را می توان با استفاده از یک استثنا سفارشی انجام داد. این شامل ایجاد یک کلاس سفارشی با استفاده ازکلاسکلمه کلیدی به شرح زیر است:
کلاس TooShortError (ValueError):
عبور
استثنای سفارشی یک نام داده می شود و بر اساس موجود استValueErrorاستثنا.
توجه داشته باشید:از کلاس های سفارشی می توان برای ایجاد بسیاری از اشیاء مختلف، نه فقط استثنا، استفاده کرد.
برای ایجاد یک کلاس جدید از کلمه کلیدی استفاده می شودکلاس، به دنبال آن نام کلاس و هر آرگومان وجود دارد. خط کد با دونقطه به پایان می رسد و بلوک کدی که در ادامه می آید شامل کارهایی است که کلاس انجام می دهد. زیرا در این حالت، استثنا فقط باید وجود داشته باشد و نیازی به انجام کار دیگری نیست، هیچ کدی لازم نیست. با این حال، یک کولون همیشه باید با یک بلوک کد دنبال شود، و بنابراین حداقل یک خط کد مورد نیاز است که هیچ کاری انجام نمی دهد. این خط کد با استفاده ازعبورکلمه کلیدی، به معنی “هیچ کدی برای اجرا در اینجا وجود ندارد.”
اکنون کل فیلمنامه به شرح زیر است:
کلاس TooShortError (ValueError):
عبور
تلاش كردن:
رمز عبور = ورودی (“یک رمز عبور جدید وارد کنید:”)
اگر لنز (رمز عبور) > 5:
print (“رمز عبور شما به اندازه کافی طولانی است.”)
دیگر:
TooShortError را افزایش دهید
به جز TooShortError:
print (“رمز عبور شما خیلی کوتاه است.”)
ایجاد کلاس سفارشی در بالای اسکریپت است زیرا هر کلاسی باید قبل از استفاده تعریف شود. بقیه اسکریپت همان است، اما استثنای نامگذاری شده استValueErrorبا استثنای سفارشی جایگزین می شودTooShortError. استفاده از کلاس های استثنای سفارشی درک کد شما را آسان تر می کند.
7.9رسیدگی به استثنائات ژئوپردازش
تا کنون، استثنائات مطرح شده کاملاً کلی هستند. یک اسکریپت پایتون، البته، می تواند به دلایل زیادی که به طور خاص به یک ابزار پردازش جغرافیایی مربوط نمی شود، شکست بخورد، همانطور که نمونه های قبلی نشان می دهد. با این حال، از آنجایی که خطاهای مربوط به ابزارهای پردازش جغرافیایی تا حدودی ماهیت منحصر به فرد دارند، توجه بیشتری را ایجاب می کنند.
شما می توانید خطاها را به دو دسته تقسیم کنید: خطاهای پردازش جغرافیایی و هر چیز دیگری. هنگامی که یک ابزار geoprocessing یک پیام خطا می نویسد، ArcPy یک خطای سیستم ایجاد می کند. به طور خاص، هنگامی که یک ابزار ژئوپردازش با شکست مواجه می شود، آن را پرتاب می کندExecuteErrorاستثنا، که می تواند برای رسیدگی به خطاهای خاص ژئوپردازش استفاده شود. این یکی از کلاس های استثنای داخلی پایتون نیست، اما توسط ArcPy تولید می شود و بنابراینarcpy.ExecuteErrorکلاس باید استفاده شود
این مثال را در نظر بگیرید:
واردات کمان
arcpy.env.workspace = “C:/Data”
in_features = “streams.shp”
out_features = “streams.shp”
تلاش كردن:
arcpy.CopyFeatures_management(in_features, out_features)
به جز arcpy.ExecuteError:
print(arcpy.GetMessages(2))
جز:
print (“خطای غیر ابزاری وجود دارد.”)
ابزار Copy Features یک خطا ایجاد می کند زیرا کلاس های ویژگی ورودی و خروجی نمی توانند یکسان باشند، به شرح زیر:
اجرا نشد. پارامترها معتبر نیستند
ERROR 000725: کلاس ویژگی خروجی: مجموعه داده C:/Data\streams.shp از قبل وجود دارد.
اجرا نشد (CopyFeatures).
در کد مثال، اولینجزدستور هر گونه خطای پردازش جغرافیایی را به دام می اندازد و دومجزدستور هر گونه خطای دیگری که به پردازش جغرافیایی مربوط نمی شود را به دام می اندازد. این مثال نشان میدهد که چگونه میتوان از استثناهای نامدار و بدون نام در یک اسکریپت استفاده کرد. مهم است که ابتدا استثناهای نامگذاری شده را بررسی کنید، مانندبه جز arcpy.ExecuteError، و سپس استثناهای بی نام. اگر ابتدا استثناهای بدون نام بررسی شوند، عبارت تمام استثناها، از جمله هر موردی را می گیردarcpy.ExecuteErrorاستثناها. شما هرگز نمی دانید که آیا یک استثناء نامگذاری شده (که در اسکریپت قرار داده اید) رخ داده است یا خیر.
در اسکریپت های بزرگتر، تعیین محل دقیق یک خطا می تواند دشوار باشد. می توانید از پایتون استفاده کنیدردیابیماژول برای جداسازی مکان و علت یک خطا.
درردیابیساختار به شرح زیر است:
واردات کمان
سیستم واردات
ردیابی واردات
تلاش كردن:
<block of code از جمله ابزارهای geoprocessing>
جز:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = (“خطاهای پایتون:\nاطلاعات ردیابی:\n” + tbinfo +
“\nاطلاعات خطا:\n” + str(sys.exc info() [1]))
msgs = “خطاهای ArcPy:\n” + arcpy.GetMessages(2) + “\n”
arcpy.AddError(pymsg)
arcpy.AddError(پیام)
چاپ (pymsg)
چاپ (پیام)
در این کد، دو نوع خطا به دام افتاده است: خطاهای پردازش جغرافیایی و همه انواع دیگر خطاها. خطاهای ژئوپردازش با استفاده ازarcpy.GetMessages()عملکرد. خطاها برای استفاده در ابزار اسکریپت با استفاده برگردانده می شوندarcpy.AddError()و همچنین با استفاده از خروجی استاندارد پایتون چاپ می شودچاپ(). همه انواع دیگر خطاها با استفاده از بازیابی می شوندردیابیمدول. مقداری قالب بندی اعمال می شود و خطاها برای استفاده در ابزار اسکریپت برگردانده می شوند و در خروجی استاندارد پایتون چاپ می شوند.
در زیر یک مثال دیگر از الف آورده شده استسعی کنید-به جزبیانیه با استفاده ازسرانجامبیانیه. در این مثال، یک کلاس استثنای سفارشی برای رسیدگی به یک خطای مجوز ایجاد می شود. یک مجوز در بررسی می شودتلاش كردنبلوک کد، و مجوز به عنوان بخشی از بررسی می شودسرانجامبلوک کد این مراحل تضمین میکنند که مجوز بررسی میشود، بدون توجه به نتیجه اجرای بلوکهای کد قبلی، به شرح زیر:
خطای مجوز کلاس (استثنا):
عبور
واردات کمان
تلاش كردن:
if arcpy.CheckExtension(“3D”) == “در دسترس”:
arcpy.CheckOutExtension (“3D”)
دیگر:
افزایش خطای مجوز
arcpy.env.workspace = “C:/Raster”
arcpy.Slope_3d(“ارتفاع”، “شیب”)
به جز LicenseError:
چاپ (“مجوز سه بعدی در دسترس نیست”)
جز:
print(arcpy.GetMessages(2))
سرانجام:
arcpy.CheckInExtension (“3D”)
به طور کلیExecuteErrorکلاس استثنا مفید است، و برخی از اسکریپت ها به ساده اما موثر متکی هستندسعی کنید-به جزبیانیه بدون استفاده از هیچ کلاس استثنای اضافی. با این حال، بهتر است از بررسی خطاهای صریح تر، از جمله استثناهای سفارشی مانند: استفاده کنیدخطای مجوزاستثنا در مثال قبلی
با استفاده ازسعی کنید-به جزعبارت برای به دام انداختن خطا رایج است. گاهی اوقات، کل اسکریپت را می بینید که در a پیچیده شده استسعی کنید-به جزبیانیه. به نظر می رسد چیزی شبیه به زیر است، که در آنتلاش كردنبلوک کد می تواند شامل صدها خط کد باشد:
واردات کمان
سیستم واردات
ردیابی واردات
تلاش كردن:
## چندین خط کد در اینجا
جز:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = (“خطاهای پایتون:\nاطلاعات ردیابی:\n” + tbinfo +
“\nاطلاعات خطا:\n” + str(sys.exc_info()[1]))
msgs = “خطاهای ArcPy:\n” + arcpy.GetMessages(2) + “\n”
arcpy.AddError(pymsg)
arcpy.AddError(پیام)
این رویکرد برای مدیریت خطا یک ساختار نسبتاً رایج برای اسکریپت های پیچیده است و به طور گسترده در این شکل یا کمی تغییر یافته استفاده می شود.
7.10استفاده از روش های دیگر رسیدگی به خطا
علاوه بر الفسعی کنید-به جزبیانیه ای برای به دام انداختن خطاها در اسکریپت ها، می توان از چندین روش دیگر رسیدگی به خطا استفاده کرد. برخی از آنها در فصل های دیگر پوشش داده شده است، اما لازم است در اینجا بیشتر ذکر شود:
- اعتبار سنجی نام جدول و فیلدها با استفاده ازValidateTableName()وarcpy.ValidateFieldName()توابع، به ترتیب.
- بررسی مجوز برای محصولات با استفاده ازCheckProduct()تابع و برای برنامه های افزودنی با استفاده ازarcpy.CheckExtension()عملکرد.
- بررسی قفلهای داده – اگر قفلهای داده در ورودی وجود داشته باشد، بسیاری از ابزارهای پردازش جغرافیایی به درستی اجرا نمیشوند.
7.11مراقب خطاهای رایج
در زیر چندین خطای رایج وجود دارد که باید هنگام اسکن اسکریپت ها و بررسی داده های خود به آنها توجه کنید.
خطاهای رایج کد پایتون
- اشتباهات املایی ساده
- فراموش کردن وارد کردن ماژول ها، مانندقوسییاسیستم عامل
- حساسیت به حروف کوچک – برای مثال،لیست مندر مقابللیست من
- مسیرها — برای مثال، با استفاده از یک اسلش (\)، مانند C:\Data\newstreams.shp
- فراموش کردن دو نقطه بعد از عبارات (برای،در حالی که،دیگر،تلاش كردن،جز)
- تورفتگی نادرست یا ناسازگار
- عبارات شرطی (==) در مقابل انتساب (=).
خطاهای رایج مربوط به ژئوپردازش
- فراموش کردن تعیین اینکه آیا داده وجود دارد یا خیر. یک اشتباه تایپی کوچک در نام یک فضای کاری یا کلاس ویژگی باعث از کار افتادن یک اسکریپت می شود. همیشه دوبار بررسی کنید که ورودی های یک اسکریپت وجود داشته باشد.
- فراموش کردن بررسی خروجی رونویسی. تنظیم پیشفرض بازنویسی خروجیها نیست، بنابراین تا زمانی که بازنویسی به طور خاص مجاز نباشد، اسکریپتی که تلاش میکند فایلهای موجود را بازنویسی کند اجرا نمیشود. یک سناریوی رایج این است که یک اسکریپت را اجرا کنید و آن را اجرا کنید (حداقل تا حدی)، اما وقتی برای بار دوم آن را اجرا میکنید، شکست میخورد زیرا نتیجه اجرای اول در حال بازنویسی است. رفع این مشکل می تواند به سادگی تنظیم باشدرونویسی خروجیدارایی ازenvکلاس بهدرست است، واقعی.
- داده ها در برنامه دیگری استفاده می شوند. ممکن است سعی کنید یک اسکریپت را اجرا کنید، اما اجرا نمی شود زیرا شما همچنین از داده ها در ArcGIS Pro استفاده می کنید. این سناریو متداول است زیرا اغلب شما در حال بررسی داده هایی هستید که در اسکریپت استفاده می شود. بستن ArcGIS Pro و امتحان مجدد اسکریپت ممکن است یک خطای اسکریپت را برطرف کند.
- بررسی نکردن خصوصیات پارامترها و اشیاء برگردانده شده توسط ابزارها. برای مثال، ممکن است منطقی به نظر برسد که ابزار Get Count یک شمارش تولید کند، یعنی یک عدد. اما در عوض، a را برمی گرداندنتیجهشی که در پنجره Results چاپ می شود، بنابراین باید از آن استفاده کنیدgetOutput()روش بدست آوردن عدد به طور مشابه، تمایز بین کلاسهای ویژگی و لایههای ویژگی ممکن است تا حدی بیاهمیت به نظر برسد، اما آنها میتوانند تنها تفاوت بین اجرای صحیح اسکریپت و شکست باشند. سینتکس اسکریپت را به دقت بررسی کنید و ماهیت دقیق ورودی ها و خروجی ها را تعیین کنید.
شایان ذکر است که هنگام استفاده از ابزارهای اسکریپت یا جعبه ابزار پایتون می توان از بسیاری از خطاهای مربوط به ژئوپردازش جلوگیری کرد. اعتبار سنجی برای جلوگیری از پارامترهای نامعتبر در این ابزار گنجانده شده است.
برخی از این پیشنهادات ممکن است ابتدایی به نظر برسند، اما راهحلها اغلب میتوانند ساده باشند اگر فقط بدانید کجا به دنبال آنها بگردید. سینتکس یک اسکریپت پایتون خوب می تواند نسبتا ساده باشد، که بخشی از زیبایی استفاده از پایتون است.
توجه داشته باشید:به یاد داشته باشید که اسکریپتهای پردازش جغرافیایی نه تنها باید از منطق کدنویسی پایتون پیروی کنند، بلکه باید از قوانین چارچوب ژئوپردازش ArcGIS Pro نیز تبعیت کنند.
نکاتی که باید به خاطر بسپارید
- خطاها در اسکریپت های پردازش جغرافیایی حتماً اتفاق می افتد. این خطاها شامل خطاهای نحوی، استثناها و خطاهای منطقی است. یکی از مزایای IDE های پایتون مانند Spyder و PyCharm این است که چک کردن نحو تعاملی و سایر ویژگی های بررسی کد را ارائه می دهند که باعث می شود هنگام نوشتن کد خود تصحیح مسائل را آسان تر کنید. اگرچه خطاهای نحوی نسبتاً آسان به دست میآیند، اسکریپت شما ممکن است حاوی انواع دیگری از خطاها باشد که از اجرای صحیح اسکریپت جلوگیری میکند. اسکریپت ها را می توان با ترکیب رویه های رسیدگی به خطا قوی تر کرد.
- روش های مختلف اشکال زدایی وجود دارد. رویکردهای نسبتاً ساده شامل بررسی دقیق پیامهای خطا، افزودن پیامهای چاپی به کد برای بررسی نتایج میانی و اظهار نظر انتخابی کد است. اگر این روش ها برای شناسایی و رفع خطاها کافی نباشد، می توان از یک دیباگر پایتون استفاده کرد. یک دیباگر به شما اجازه می دهد تا با دقت از طریق کد، خط به خط، پیغام های خطا را بررسی کرده و وضعیت متغیرها را بررسی کنید. نقاط شکست اغلب به جای ارزیابی خط به خط یک اسکریپت برای عبور از بلوک های بزرگتر کد استفاده می شود. روش های خاص اشکال زدایی بسته به IDE مورد استفاده تا حدودی متفاوت است.
- یک روش اشکال زدایی معمولاً محل وقوع خطا را مشخص می کند اما دقیقاً دلیل رخ دادن آن را مشخص نمی کند. بنابراین، تمرین خوب است که همیشه از خطاهای رایج، از جمله خطاهای کدگذاری پایتون و خطاهای پردازش جغرافیایی ArcGIS Pro آگاه باشید.
- روشهای اصلی رسیدگی به خطا شامل بررسی وجود دادهها، تعیین اینکه آیا ورودی دادهها نوع مناسبی هستند، بررسی مجوزها و برنامههای افزودنی، و اعتبارسنجی نام جدول و فیلد است. به طور معمول، یکاگردستور برای این نوع رسیدگی به خطا استفاده می شود.
- پیشبینی هر نوع خطا تقریباً غیرممکن است، و کدی که بررسی چنین خطاهایی برای نوشتن بسیار دشوار است. هر زمان که مشکلی در یک اسکریپت پیش بیاید، یک استثنا به طور خودکار مطرح می شود. این استثناها را می توان با استفاده از a به دام انداختسعی کنید-به جزبیانیه. این نوع دستور تشخیص نوع خطا را ممکن می سازد. رویه های سفارشی رسیدگی به خطا را می توان بر اساس خطا اجرا کرد. اظهارات اضافی، از جملهدیگروسرانجام، می توان به آن اضافه کردسعی کنید-به جزبیانیه برای اطمینان از به دام انداختن کارآمد خطا.
- استثناهای داخلی شامل موارد کلی استاستثناکلاس و همچنین بسیاری از استثناهای نامگذاری شده دیگر. شما همچنین می توانید استثناهای سفارشی خود را ایجاد کنید، که اسکریپت های شما را قوی تر و قابل درک تر می کند.
- پیام های خطا می توانند برای شناسایی ماهیت خطا و نحوه رفع اسکریپت مفید باشند. اینها هم پیامهای عمومی پایتون و هم پیامهای خطای ناشی از آن را شامل میشوندExecuteErrorکلاس استثنا
شرایط کلیدی
- نقطه شکست
- نظر دادن کد
- کلاس سفارشی
- استثنای سفارشی
- اشکال زدا
- اشکال زدایی
- رسیدگی به خطا
- استثنا
- شی استثنا
- تورفتگی
- خطای منطقی
- به نام استثنا
- فاصله گذاری
- خطای نوشتاری کد
- ردیابی
- استثنا بی نام
سوالات را مرور کنید
- نمونه هایی از برخی از رایج ترین خطاهای نحوی را ارائه دهید.
- استثناها چیست؟ چگونه مدیریت استثناها منجر به اسکریپت های قوی تر می شود؟
- برخی از روش های معمول اشکال زدایی را شرح دهید.
- مراحل استفاده از دیباگر پایتون را توضیح دهید.
- کاربرد آن را توضیح دهیدسعی کنید-به جزبیانیه برای رسیدگی به استثناها.
- توضیح دهید که چگونه استفاده از استثناهای سفارشی می تواند کد شما را قوی تر کند.
بدون دیدگاه