Eu tenho um diretório com um monte de arquivos dentro: eee2314
, asd3442
... e eph
.
Desejo excluir todos os arquivos que começam eph
com a glob
função.
Como eu posso fazer isso?
As regras de padrão para glob não são expressões regulares. Em vez disso, eles seguem as regras padrão de expansão de caminho do Unix. Existem apenas alguns caracteres especiais: dois curingas diferentes e intervalos de caracteres são suportados [de glob ].
Portanto, você pode excluir alguns arquivos com padrões.
Por exemplo, para excluir arquivos de manifestos (arquivos começando com _
) com glob, você pode usar:
files = glob.glob('files_path/[!_]*')
eph
mas podem começar com qualquer outra coisa.[!e][!p][!h]
irá filtrar os arquivos que começam com,eee
por exemplo.Você pode deduzir conjuntos:
fonte
set(glob("*")) - set(glob("eph*"))
(e observe * no final de "eph *")list(set(glob("*")) - set(glob("eph")))
Você não pode excluir padrões com a
glob
função, globs permitem apenas padrões de inclusão . A sintaxe de globbing é muito limitada (até mesmo uma[!..]
classe de caractere deve corresponder a um caractere, portanto, é um padrão de inclusão para cada caractere que não está na classe).Você terá que fazer sua própria filtragem; uma compreensão de lista geralmente funciona bem aqui:
fonte
iglob
aqui para evitar o armazenamento da lista completa na memóriaiglob
produz listas de qualquer maneira ; tudo o que você faz é avaliar o filtro preguiçosamente. Isso não ajudará a reduzir o consumo de memória.os.listdir()
resultado é mantido na memória conforme você itera. Massomepath/*.txt
tem que ler todos os nomes de arquivo em um diretório na memória e, em seguida, reduzir essa lista para apenas aqueles que correspondem.glob.glob(x) = list(glob.iglob(x))
,. Não é muito uma sobrecarga, mas é bom saber.Atrasado no jogo, mas você pode, alternativamente, apenas aplicar um python
filter
ao resultado deglob
:ou substituindo o lambda por uma pesquisa regex apropriada, etc ...
EDIT: Acabei de perceber que se você estiver usando caminhos completos, o
startswith
não funcionará, então você precisa de um regexfonte
Que tal pular um arquivo específico enquanto itera todos os arquivos na pasta! O código abaixo pularia todos os arquivos do Excel que começam com 'eph'
Dessa forma, você pode usar padrões regex mais complexos para incluir / excluir um determinado conjunto de arquivos em uma pasta.
fonte
Compare com
glob
, eu recomendopathlib
, filtrar um padrão é muito simples.e se você quiser filtrar um padrão mais complexo, pode definir uma função para fazer isso, assim:
usar esse código, você pode filtrar todos os arquivos que começam com
eph
ou começam comepi
.fonte
De forma mais geral, para excluir arquivos que não estão em conformidade com alguma regexp de shell, você pode usar o módulo
fnmatch
:O código acima irá primeiro gerar uma lista de um determinado caminho e, em seguida, exibir os arquivos que não satisfarão a expressão regular com a restrição desejada.
fonte
Conforme mencionado pela resposta aceita, você não pode excluir padrões com glob, então o seguinte é um método para filtrar seu resultado glob.
A resposta aceita é provavelmente a melhor maneira pythônica de fazer as coisas, mas se você acha que as compreensões de lista parecem um pouco feias e quer tornar seu código numpythônico máximo de qualquer maneira (como eu fiz), então você pode fazer isso (mas note que isso é provavelmente menos eficiente do que o método de compreensão de lista):
(No meu caso, eu tinha alguns quadros de imagem, quadros enviesados e quadros planos, todos em um diretório e queria apenas os quadros de imagem)
fonte
Se a posição do caractere não for importante, por exemplo, para excluir arquivos de manifestos (onde quer que seja encontrado
_
) comglob
ere
- operações de expressão regular , você pode usar:Ou de uma forma mais elegante -
list comprehension
fonte
Você pode usar o método abaixo:
fonte