Neste Tutorial Python vamos ver um script que irá mudar a aparência de .txt para .sh nos arquivos, e também dará permissões de execução para o usuário. Para esta tarefa vamos usar módulos que já temos em Python, o script é válido tanto para a versão 2.X quanto para 3.X, embora a saída seja um pouco diferente, o comportamento não muda, como veremos a seguir.
ObservaçãoO script a ser implementado é para uso em sistemas operacionais UNIX.
Para o exemplo, criei uma pasta com vários arquivos, alguns têm extensão .txt e outros não, e também há um arquivo chamado test1.txt que tem um pequeno comando: ls -l. É para verificar se ele está realmente executado, já que os demais são "pegajosos", pois não contêm dados. O conteúdo da pasta pode ser visto na seguinte imagem:
Se fizermos um ls -l vemos que nenhum tem permissões de execução:
Agora veremos o código completo e será explicado a seguir.
import os, sys, stat from subprocess import Popen, PIPE if (len (sys.argv) <2): print ("O caminho a ser procurado é obrigatório") sys.exit (0) elif (não os.path.exists (sys.argv [1])): print ("Não encontrado:" + str (sys.argv [1])) sys.exit (0) process = Popen (["encontrar", sys.argv [1]] , stdout = PIPE, stderr = PIPE) se não process.stderr.read (): num = 0 para linha em process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () se (".txt" em lineNew e os.path.isfile (lineNew)): new = lineNew.replace (". txt", ". sh") os.rename (lineNew, new) os.chmod (new, stat. S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1 imprimir ("Trabalho concluído, alterado", num, "arquivos") else: imprimir ("Erro")Vamos começar com a explicação do código passo a passo, a primeira coisa que faremos é importar os módulos que vamos precisar.
import os, sys, stat from subprocess import Popen, PIPEEm seguida, verificaremos se nos foi passado um argumento e se é uma rota, para ver se continuamos com o script ou não.
if (len (sys.argv) <2): print ("O caminho a ser pesquisado é obrigatório") sys.exit (0) elif (não os.path.exists (sys.argv [1])): print ( "Não encontrado:" + str (sys.argv [1])) sys.exit (0)Para continuar usamos Popen do módulo subprocesso, capturamos a saída padrão e a saída de erro, fazemos isso com a ajuda de TUBO, Um cano. Agora podemos ler o pipeline como se fosse um arquivo.
processo = Popen (["encontrar", sys.argv [1]], stdout = PIPE, stderr = PIPE)Para saber se devemos continuar, verificamos se há um erro (armazenado em process.stderr) com o seguinte se:
se não process.stderr.read ():Se houver um erro, ele será exibido na tela Erro (isso é para o outro ramo, que não tem mais explicações) e o programa é encerrado. Se não, o que vamos fazer é ler a partir do canal de saída padrão (stdout) Fazemos linha por linha com um for, temos que decodificar a saída, neste caso opto por UTF-8, pois com ASCII daria erros com os acentos por exemplo.
Se continuarmos olhando para o loop for, veremos que verificamos se a linha lida contém .txt, em caso afirmativo também é verificado se é um arquivo (não estamos interessados em alterar uma pasta que contém .txt). Se isso for verdade, usamos a função substituir de Python para mudar .txt para .sh, e então com a função chmod do módulo damos a você permissões, que serão execução, leitura e escrita para o usuário, leitura e execução para o grupo e nada para os outros. Como você pode ver, usamos o módulo stat.
A variável num que você verá no código é simplesmente usada para controlar o número de arquivos que alteramos e, assim, no final, podermos exibir as informações na tela.
para a linha em process.stdout.readlines (): lineNew = line.decode ("UTF-8"). strip () if (". txt" em lineNew e os.path.isfile (lineNew)): new = lineNew. substituir (". txt", ". sh") os.rename (linhaNovo, novo) os.chmod (novo, stat.S_IXUSR + stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IXGRP) num + = 1No final do loop for, o que fazemos é mostrar a informação de que estamos falando, é aqui que encontraremos a diferença entre a versão 2.xe 3.x, já que as vírgulas antes e depois de num na versão 2 a separam em uma lista e no 3 mostra normal (sem lista).
imprimir ("Trabalho realizado, alterado", num, "arquivos")Isso pode ser alterado para ser interpretado da mesma forma usando o + e converter a variável num em uma string com a função str, ou através de %, abaixo estão os 2 códigos:
print ("Trabalho concluído, alterado" + str (num) + "arquivos") print ("Trabalho concluído, alterado% d arquivos"% num)Deixou-se na primeira forma de mostrar que entre as versões do Python existem mudanças (podem ser pequenas como neste caso, mas algo que funciona na versão 3 pode não funcionar na versão 2, e vice-versa).
Agora e quase para terminar o tutorial vamos executar o código e ver como funciona, abaixo deixo 2 imagens da execução, usando Python 3.x na primeira, e na segunda Python 2.x:
Aqui apreciamos as pequenas diferenças. Agora vamos ver como a pasta de teste que vimos antes se parece:
Os 4 arquivos que tinham .txt foram alterados e agora possuem .sh, parece que apenas o arquivo test1.sh é executável, isso porque o resto não contém dados. Vamos executar o arquivo test1.sh, que só vai lançar o ls -l que dissemos que contém, e isso nos ajuda a ver as permissões.
O tutorial termina aqui, caso seja de interesse, um link para outro tutorial em Python: pesquisa por nome de arquivo.
Gostou e ajudou este tutorial?Você pode recompensar o autor pressionando este botão para dar a ele um ponto positivo