6 votos

¿Cómo reemplazar el nombre de un shapefile en un directorio usando Python QGIS?

¿Cómo reemplazar el nombre o eliminar el archivo .shp del directorio usando Python QGIS?

import os
import processing
input = "//input.shp"
output = "//output_100.shp"
interval = 100
processing.runalg("qgis:densifygeometriesgivenaninterval", input,    interval, output)
paths = (os.path.join(root, filename)
    for root, _, filenames in os.walk("C:/" + os.getenv('USERNAME') + "/SHP_Path")
    for filename in filenames)

for path in paths:
newname = path.replace('_100', '')
if newname != path:
    os.rename(path, newname)

Resultado:

WindowsError: [Error 183] Can't create existing file.

Creo que debería borrar input.shp antes de renombrar output.shp a input.shp. Pero si voy a tratar de eliminar que los archivos (.shp, .dbf, .shx) con el código:

    filename="C:/" + os.getenv('USERNAME') + "/SHP_Path" + "//input.shp"
if os.path.exists(filename):
os.remove(filename)

Tengo resultados:

WindowsError: [Error 32] The process can not obtain access to the file because it is being used by another process :

5voto

Mue Puntos 2469

Creo que hay dos métodos que podrían evitar el problema:


  • Utilizar la capa de memoria como entrada

Cree una copia de su capa de entrada como memoria de esta manera puede seguir utilizando los mismos datos que la entrada original, pero también "libera" el shapefile de estar bloqueado. La capa de memoria también tiene que ser añadida al QgsMapLayerRegistry antes de poder utilizarlo en el algoritmo de procesamiento.

import glob, os, processing

input = "//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' is the new memory layer
# Change 'LineString' to 'Point' or 'Polygon' etc depending on your layer type

temp_data = temp.dataProvider()
attr = layer.dataProvider().fields().toList()
temp_data.addAttributes(attr)
temp.updateFields()
temp_data.addFeatures(feats)
QgsMapLayerRegistry.instance().addMapLayer(temp)
# Adds memory layer with all copied attributes to ToC

interval = 100
processing.runalg("qgis:densifygeometriesgivenaninterval", temp, interval, output)
# Processing algorithm uses memory layer as input parameter

QgsMapLayerRegistry.instance().removeMapLayer(temp.id())
del layer
# Removes from ToC, deletes the dependency on original input shapefile

os.chdir("C:\Users\gfb11209\Desktop\New folder (2)//")
for input_file in glob.glob("input*"):
    os.remove(input_file)
    # Sets current directory to desired folder and removes "input" files

for output_file in os.listdir("."):
    os.rename(output_file, output_file.replace("output_100", "input"))
    # Renames "output_100" files to "input"

(Crédito a @Detlev y @xunilk por sus muy útiles respuestas de este Correo electrónico: .)


  • Dividir script / reiniciar QGIS

Podrías dividir tu script en dos partes. Ejecute la primera parte para ejecutar el algoritmo y, una vez guardada la salida, reinicie QGIS y ejecute la segunda parte del script. De esta manera, los archivos de entrada ya no deberían ser utilizados y pueden ser eliminados con seguridad.

Así que tu primer script podría ser así:

import processing

input = "//input.shp"
output = "//output_100.shp"
interval = 100

processing.runalg("qgis:densifygeometriesgivenaninterval", input, interval, output)

Reinicie QGIS y luego ejecútelo:

import os, glob

os.chdir("C:/" + os.getenv('USERNAME') + "/SHP_Path//")
for input_file in glob.glob("input*"):
    os.remove(input_file)    # Removes all files beginning with "input" (eg. input.dbf, input.prj etc)

for output_file in os.listdir("."):
    os.rename(output_file, output_file.replace("output_100", "input"))

0 votos

Hice el mismo truco pero reiniciar QGIS para eliminar un archivo no es cómodo. Estoy esperando otra solución pero por supuesto muchas gracias por su ayuda e interesante.

0 votos

@Artec - Hola amigo, he editado mi post para incluir otro método que no requiere reiniciar QGIS.

1 votos

@ Joseph este método funciona muy bien. Me alegro mucho de haber podido contar con su ayuda.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X