Meu script python executa um os.listdir(path)
onde o caminho é uma fila contendo arquivos que preciso tratar um por um.
O problema é que estou colocando a lista em uma matriz e então faço um simples array.pop(0)
. Estava funcionando bem até que coloquei o projeto em subversão. Agora eu pego a .svn
pasta em meu array e, claro, isso faz meu aplicativo travar.
Portanto, aqui está a minha pergunta: existe uma função que ignora os arquivos ocultos ao executar um os.listdir()
e se não, qual seria a melhor maneira?
python
hidden-files
Talnicolas
fonte
fonte
listdir_nohidden
não é totalmente compatível comos.listdir
, já que o uso de ayield
torna um gerador. Em vez disso, ele deve percorrer a lista de saídaos.listdir
e remover as entradas que começam com '.'list(listdir_nohidden(path))
e com a qual essa nova função seja exatamente compatívelos.listdir
.Esta é uma pergunta antiga, mas parece que está faltando a resposta óbvia de usar a compreensão de lista, então estou adicionando aqui para completar:
[f for f in os.listdir(path) if not f.startswith('.')]
Como uma observação lateral, o estado docs
listdir
retornará resultados em 'ordem arbitrária', mas um caso de uso comum é classificá-los em ordem alfabética. Se você deseja que o conteúdo do diretório seja classificado em ordem alfabética sem considerar a capitalização, você pode usar:sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
fonte
key=lambda f: f.lower()
pode ser escrito sem lambda:key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
No Windows, Linux e OS X:
if os.name == 'nt': import win32api, win32con def folder_is_hidden(p): if os.name== 'nt': attribute = win32api.GetFileAttributes(p) return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM) else: return p.startswith('.') #linux-osx
fonte
[f for f in os.listdir(path) if not folder_is_hidden(f)]
Joshmaker tem a solução certa para sua pergunta.
Como ignorar arquivos ocultos usando os.listdir ()?
No entanto, no Python 3, é recomendado usar pathlib em vez de os.
from pathlib import Path visible_files = [ file for file in Path(".").iterdir() if not file.name.startswith(".") ]
fonte
glob :
>>> import glob >>> glob.glob('*')
(
glob
afirma usarlistdir
e porfnmatch
baixo do capô, mas também verifica se há uma guia'.'
, não usandofnmatch
.)fonte
Eu acho que é muito trabalhoso passar por todos os itens em um loop. Eu preferiria algo mais simples como isto:
lst = os.listdir(path) if '.DS_Store' in lst: lst.remove('.DS_Store')
Se o diretório contiver mais de um arquivo oculto , isso pode ajudar:
all_files = os.popen('ls -1').read() lst = all_files.split('\n')
para independência de plataforma, como @Josh mencionou, o glob funciona bem:
import glob glob.glob('*')
fonte
.DS_Store
é criado automaticamente. Ao compactar todos os arquivos e enviá-los para um servidor,.DS_Store
também é adicionado. Se houver vários arquivos ocultos, você pode tentaros.system('ls -1')
os.popen('ls -1').read()
não funcionará no Windows. Esse é o ponto principal deos.listdir()
.filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
fonte