Eu preciso percorrer os subdiretórios de um determinado diretório e procurar arquivos. Se eu receber um arquivo, tenho que abri-lo, alterar o conteúdo e substituí-lo por minhas próprias linhas.
Eu tentei isso:
import os
rootdir ='C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
f=open(file,'r')
lines=f.readlines()
f.close()
f=open(file,'w')
for line in lines:
newline = "No you are not"
f.write(newline)
f.close()
mas estou recebendo um erro. O que estou fazendo de errado?
Respostas:
O passeio real pelos diretórios funciona como você o codificou. Se você substituir o conteúdo do loop interno por uma
print
declaração simples , poderá ver que cada arquivo foi encontrado:Se você ainda receber erros ao executar o procedimento acima, forneça a mensagem de erro.
Atualizado para Python3
fonte
Outra maneira de retornar todos os arquivos nos subdiretórios é usar o
pathlib
módulo , introduzido no Python 3.4, que fornece uma abordagem orientada a objetos para lidar com os caminhos do sistema de arquivos (Pathlib também está disponível no Python 2.7 através do módulo pathlib2 no PyPi ):Desde o Python 3.5, o
glob
módulo também oferece suporte à localização de arquivos recursivos:A
file_list
partir de qualquer uma das abordagens acima pode ser iterada sem a necessidade de um loop aninhado:fonte
pathlib
me usar , principalmente porque gosto da sintaxe dos métodos orientados a objetos. Existem outras diferenças, como a biblioteca de caminhos retorna classes de caminhos específicos em vez de cadeias, e as funções disponíveis diferem entre as bibliotecas (por exemplo,os.path.expanduser('~')
vsPath.home()
). Navegue pela documentação e veja qual abordagem você prefere.**
no padrão glob, você pode usarrglob
.A partir de 2020 ,
glob.iglob(path/**, recursive=True)
parece a solução mais pitônica , ou seja:Resultado:
Notas:
1 - glob.iglob
2 - Se recursivo for
True
, o padrão'**'
corresponderá a todos os arquivos e zero ou maisdirectories
esubdirectories
.3 - Se o diretório contiver arquivos começando com,
.
eles não serão correspondidos por padrão. Por exemplo, considere um diretório que contémcard.gif
e.card.gif
:4 - Você também pode usar
rglob(pattern)
, que é o mesmo que chamarglob()
com**/
adicionado na frente do padrão relativo fornecido.fonte