أكثر

كيف تستبدل اسم ملف أشكال في دليل باستخدام Python QGIS؟

كيف تستبدل اسم ملف أشكال في دليل باستخدام Python QGIS؟


كيفية استبدال الاسم أو حذف ملف .shp من الدليل باستخدام Python QGIS؟

استيراد معالجة استيراد نظام التشغيل = "//input.shp" الإخراج = "//output_100.shp" الفاصل الزمني = 100 Processing.runalg ("qgis: densifygeometriesgivenaninterval" ، المدخلات ، الفاصل الزمني ، الإخراج) المسارات = (os.path.join ( root ، filename) للجذر ، _ ، أسماء الملفات في os.walk ("C: /" + os.getenv ('USERNAME') + "/ SHP_Path") لاسم الملف في أسماء الملفات) للمسار في المسارات: newname = path.replace ('_100'، ") if newname! = path: os.rename (path، newname)

نتيجة:

خطأ Windows: [خطأ 183] لا يمكن إنشاء ملف موجود.

أعتقد أنه يجب علي حذف input.shp قبل إعادة تسمية output.shp إلى input.shp. ولكن إذا كنت سأحاول حذف تلك الملفات (.shp ، .dbf ، .shx) برمز:

filename = "C: /" + os.getenv ('USERNAME') + "/ SHP_Path" + "//input.shp" إذا كان os.path.exists (اسم الملف): os.remove (اسم الملف)

لقد حصلت على نتيجة:

خطأ Windows: [خطأ 32] لا يمكن للعملية الوصول إلى الملف لأنه قيد الاستخدام من قبل عملية أخرى:

أعتقد أن هناك طريقتين يمكنهما التغلب على المشكلة:


  • استخدم طبقة الذاكرة كمدخلات

قم بإنشاء نسخة من طبقة الإدخال كملف ذاكرة طبقة ، بهذه الطريقة يمكنك الاستمرار في استخدام نفس البيانات مثل الإدخال الأصلي ولكنها أيضًا "تحرر" ملف الشكل من أن يتم قفله. يجب أيضًا إضافة طبقة الذاكرة إلى ملفQgsMapLayerRegistryقبل أن يتم استخدامه في خوارزمية المعالجة.

استيراد glob ، os ، معالجة المدخلات = "//input.shp" output = "//output_100.shp" layer = QgsVectorLayer (input، "any_name"، "ogr") feats = [feat for feat in layer.getFeatures () ] temp = QgsVectorLayer ("LineString؟ crs = epsg: 4326"، "result"، "memory") # 'temp' هي طبقة الذاكرة الجديدة # قم بتغيير 'LineString' إلى 'Point' أو 'Polygon' إلخ اعتمادًا على الطبقة الخاصة بك اكتب temp_data = temp.dataProvider () attr = layer.dataProvider (). الحقول (). toList () temp_data.addAttributes (Attr) temp.updateFields () temp_data.addFeatures (feats) QgsMapLayerRegistry.instance (). addMapLayerRegistry.instance (). # يضيف طبقة ذاكرة مع جميع السمات المنسوخة إلى ToC الفاصل الزمني = 100 معالجة. )) del layer # يزيل من ToC ، يحذف التبعية على شكل الإدخال الأصلي os.chdir ("C:  Users  gfb11209  Desktop  New folder (2) //") for input_file في glob.glob ("inpu t * "): os.remove (input_file) # يعين الدليل الحالي إلى المجلد المطلوب ويزيل ملفات" الإدخال "لملف الإخراج في os.listdir (". "): os.rename (output_file، output_file.replace (" output_100 "، "الإدخال")) # إعادة تسمية ملفات "output_100" إلى "الإدخال"

(الائتمان إلىDetlev وxunilk لإجاباتهم المفيدة للغاية من هذا المنشور.)


  • تقسيم البرنامج النصي / إعادة تشغيل QGIS

يمكنك تقسيم البرنامج النصي الخاص بك إلى قسمين. قم بتشغيل الجزء الأول لتنفيذ الخوارزمية وبمجرد حفظ الإخراج ، أعد تشغيل QGIS وقم بتشغيل الجزء الثاني من البرنامج النصي. بهذه الطريقة ، لا يجب استخدام ملفات الإدخال ويمكن إزالتها بأمان.

لذلك يمكن أن يبدو النص الأول الخاص بك كما يلي:

إدخال معالجة الاستيراد = "//input.shp" الإخراج = "//output_100.shp" الفاصل الزمني = 100 Processing.runalg ("qgis: densifygeometriesgivenaninterval" ، الإدخال ، الفاصل الزمني ، الإخراج)

أعد تشغيل QGIS ثم قم بتشغيل:

استيراد نظام التشغيل ، glob os.chdir ("C: /" + os.getenv ('USERNAME') + "/ SHP_Path //") لملف الإدخال في glob.glob ("الإدخال *"): os.remove (input_file) # يزيل جميع الملفات التي تبدأ بـ "المدخلات" (على سبيل المثال ، input.dbf ، و input.prj ، إلخ) لملف الإخراج في os.listdir ("."): os.rename (output_file ، output_file.replace ("output_100" ، "المدخلات") )

شاهد الفيديو: QGIS Python PyQGIS - Create a Custom Processing Script for QGIS in the Processing Toolbox