Contornando rapidamente o erro “file is not a directory” ao salvar arquivos no PyQGIS

Colegas pesquisadores e entusiastas de SIG e código-livre,

Bem-vindos ao meu blog!

Gostaria de começar com um aviso - posso ser pesquisadora desta área, mas isso não significa que tudo o que faço ou escrevo aqui funcionará para você, em suas próprias configurações de desktop e versões de packages. Me eximo de responsabilidade se você perder dados ou bagunçar sua instalação. Eu também não autorizo nenhum tipo de cópia do meu conteúdo.

Hoje, explorarei um outro erro do PyQGIS (Python Console, no QGIS) e as suas causas. Infelizmente, não encontrei uma solução direta para este. Porém, encontrei uma solução alternativa.

Descrição do erro

Este erro é especialmente comum quando você está executando novamente um código que já executou anteriormente. Às vezes, enquanto estou programando, executo uma versão incompleta do meu código, só para ver se o compilador/interpretador acusa algum erro até ali. Os meus códigos freqüentemente incluem a abertura e/ou salvamento de arquivos no disco rígido. Em um dos meus códigos, eu pensava que o arquivo em questão seria sobrescrito toda vez que eu executasse um salvamento de arquivo no Console Python do QGIS. Mas, em vez disso, recebi este erro:

_core.QgsProcessingException: Could not create layer folder/output.shp: Creation of data source failed (OGR error: folder/output.shp is not a directory.)

Fui lá verificar e, sim, é verdade, output.shp não é um diretório. Ele é o arquivo que eu quero sobrescrever, mas, infelizmente, não está sendo reconhecido como um arquivo a ser sobrescrito.

O código que eu estava tentando executar quando obtive o erro

Obtive o erro ao tentar executar um código semelhante ao mostrado abaixo, em um loop dentro do console Python. Minha ideia original era que o arquivo fosse sobrescrito a cada loop.

paramexp= {'INPUT': extent,'OUTPUT': 'folder/output.shp'}
processing.run("native:extenttolayer", paramexp)

Contornando este erro

Caso 1: o salvamento de arquivo que causa este erro não está dentro de um loop

Neste caso, o simples fato de deletar o arquivo antes de cada execução do código provavelmente resolverá o problema. Se isso não resolver, tente fechar o QGIS e reabri-lo. Às vezes, quando o código é interrompido no meio da execução, alguns arquivos ficam abertos. Isso faz com o código não rode novamente, a menos que se feche o QGIS e abra de novo.

Caso 2: o salvamento de arquivo que causa este erro está dentro de um loop

Para este caso, eu não encontrei outra alternativa a não ser criar um contador dentro do loop (mas pode ser feito com o comando enumerate também, se for o caso, ou você pode usar um nome de variável qualquer que mude de acordo com a iteração) e adicioná-lo ao nome do arquivo, para não ter dois nomes de arquivo idênticos. Um exemplo:

counter=0
for i in list:
    counter=counter+1
    outputname='folder/filename'+str(counter)+'.shp' #name of the file
    paramexp= {'INPUT': extent_given,'OUTPUT':outputname} #parameters
    processing.run("native:extenttolayer", paramexp) #processing and saving the file

posteriormente à execução do seu código, você pode usar o próprio Python ou qualquer outro recurso para excluir os arquivos gerados automaticamente. No Ubuntu, eu simplesmente abriria um novo Terminal e digitaria

rm folder/filename*.shp 

depois do término da execução do código.

Se os arquivos forem muito grandes e você for ficar sem espaço antes deste loop do Python terminar, basta adicionar uma linha no seu código na qual você exclui o arquivo gerado na iteração anterior. Algo como:

import os
counter=0
for i in list:
    os.remove(outputname)
    counter=counter+1
    outputname='folder/filename'+str(counter)+'.shp' #name of the file
    paramexp= {'INPUT': extent_given,'OUTPUT':outputname} #parameters
    processing.run("native:extenttolayer", paramexp) #processing and saving the file

Espero que esta postagem seja útil para você e, caso encontre uma solução mais direta para esse problema, por favor, me avise!

Luísa Vieira Lucchese
Luísa Vieira Lucchese
Pós-doutoranda

Pós-doutoranda na Universidade de Pittsburgh

Relacionados