Vairāk

Kā nomainīt formas faila nosaukumu direktorijā, izmantojot Python QGIS?


Kā nomainīt nosaukumu vai izdzēst .shp failu no direktorija, izmantojot Python QGIS?

importēt os importēšanas apstrāde input = "//input.shp" output = "//output_100.shp" interval = 100 processing.runalg ("qgis: densifygeometriesgivenaninterval", input, interval, output) paths = (os.path.join ( sakne, faila nosaukums) saknei, _, failu nosaukumi os.walk ("C:/" + os.getenv ('USERNAME') + "/SHP_Path") faila nosaukumam failu nosaukumos) ceļam ceļos: jauns vārds = ceļš. aizstāt ('_100', ") ja jauns nosaukums! = Ceļš: os.rename (ceļš, jauns vārds)

Rezultāts:

Windows kļūda: [kļūda 183] Nevar izveidot esošu failu.

Es domāju, ka man vajadzētu izdzēst input.shp pirms output.shp pārdēvēšanas par input.shp. Bet, ja es mēģināšu izdzēst šos failus (.shp, .dbf, .shx) ar kodu:

faila nosaukums = "C:/" + os.getenv ('USERNAME') + "/SHP_Path" + "//input.shp", ja os.path.exist (faila nosaukums): os.remove (faila nosaukums)

Man ir rezultāts:

Windows kļūda: [32. kļūda] Process nevar piekļūt failam, jo ​​to izmanto cits process:

Es domāju, ka ir 2 veidi, kā novērst šo problēmu:


  • Kā ievadi izmantojiet atmiņas slāni

Izveidojiet ievades slāņa kopiju kā atmiņa slāni, tādā veidā jūs varat turpināt izmantot tādus pašus datus kā sākotnējā ievade, taču tas arī “atbrīvo” formas failu no bloķēšanas. Atmiņas slānis ir jāpievieno arīQgsMapLayerRegistrypirms to varēja izmantot apstrādes algoritmā.

importēt glob, os, apstrādes ievade = "//input.shp" output = "//output_100.shp" layer = QgsVectorLayer (ievade, "any_name", "ogr") feats = [feat for feat in layer.getFeatures () ] temp = QgsVectorLayer ("LineString? crs = epsg: 4326", "rezultāts", "atmiņa") # 'temp' ir jaunais atmiņas slānis # Mainīt 'LineString' uz 'Point' vai 'Polygon' utt. atkarībā no jūsu slāņa ierakstiet temp_data = temp.dataProvider () attr = layer.dataProvider (). lauki (). toList () temp_data.addAttributes (attr) temp.updateFields () temp_data.addFeatures (feats) QgsMapLayerRegistry.instance (). addMapL # Pievieno atmiņas slāni ar visiem kopētajiem atribūtiem ToC interval = 100 processing.runalg ("qgis: densifygeometriesgivenaninterval", temp, interval, output) # Apstrādes algoritms izmanto atmiņas slāni kā ievades parametru QgsMapLayerRegistry.instance (). RemoveMapLayer (temp.id ( )) del layer # Noņem no ToC, dzēš atkarību no sākotnējās ievades shapefile os.chdir ("C:  Users  gfb11209  Desktop  New folder (2) //") ievades_failam glob.glob ("inpu t*"): os.remove (input_file) # Iestata pašreizējo direktoriju vēlamajā mapē un noņem" input "failus output_file no os.listdir (". "): os.rename (output_file, output_file.replace (" output_100 ", "input")) # "output_100" failus pārdēvē par "input"

(Paldies @Detlev un @xunilk par ļoti noderīgajām atbildēm no šī ziņojuma.)


  • Sadalīt skriptu / restartēt QGIS

Jūs varētu sadalīt savu skriptu divās daļās. Palaidiet pirmo daļu, lai izpildītu algoritmu, un, kad izvade ir saglabāta, restartējiet QGIS un palaidiet skripta otro daļu. Tādā veidā ievades failus vairs nevajadzētu izmantot, un tos var droši noņemt.

Tātad jūsu pirmais skripts varētu izskatīties šādi:

importēšanas apstrādes ievade = "//input.shp" output = "//output_100.shp" interval = 100 processing.runalg ("qgis: densifygeometriesgivenaninterval", ievade, intervāls, izvade)

Restartējiet QGIS un pēc tam palaidiet:

importēt os, glob os.chdir ("C:/" + os.getenv ('USERNAME') + "/SHP_Path //") ievades_failam glob.glob ("input*"): os.remove (input_file) # Noņem visus failus, kas sākas ar "input" (piemēram, input.dbf, input.prj utt.) Izejas_failam os.listdir ("."): Os.rename (output_file, output_file.replace ("output_100", "input")) )


Skatīties video: Kaip pakeisti betkokio failo formata (Oktobris 2021).