2013-06-24 2 views
1

Я хочу перечислить все файлы с одинаковым именем независимо от их расширений.Получение файлов с одинаковым именем независимо от их расширения

os.walk приводит к пустым спискам при попытке поиска имени файла без расширения, но когда я упоминаю имя файла с расширением. В нем перечислены все файлы, присутствующие в любом каталоге с тем же именем и расширением.

def get_all_files(path): 
    Datafiles=[] 

    for root,dirs,files in os.walk(path): 
     for file in files: 
      pathname=os.path.join(root,file) 
      Datafiles.append([file,pathname]) 

    return Datafiles 
+0

'os.walk' не делает globbing – simonzack

ответ

2

Вы можете использовать функцию fnmatch.filter() распознавать имена файлов, представляющие интерес:

import os, fnmatch 

def get_all_files(path, pattern): 
    datafiles = [] 

    for root,dirs,files in os.walk(path): 
     for file in fnmatch.filter(files, pattern): 
      pathname = os.path.join(root, file) 
      filesize = os.stat(pathname).st_size 
      datafiles.append([file, pathname, filesize]) 

    return datafiles 

print get_all_files('.', 'something.*') # all files named 'something' 

Примечание, однако, можно было бы, с несколько более строк кода, также сделать что-то более общий который поддерживал все именованные аргументы os.walk() «s:

import os, fnmatch 

def glob_walk(top, pattern, **kwargs): 
    """ Wrapper for os.walk() that filters the files returned 
     with a pattern composed of Unix shell-style wildcards 
     as documented in the fnmatch module. 
    """ 
    for root, dirs, files in os.walk(top, **kwargs): 
     yield root, dirs, fnmatch.filter(files, pattern) 

# sample usage 
def get_all_files(path, pattern): 
    for root, dirs, files in glob_walk(path, pattern): 
     for file in files: 
      pathname = os.path.join(root, file) 
      filesize = os.stat(pathname).st_size 
      yield file, pathname, filesize 

print list(get_all_files('.', 'something.*')) # all files named 'something' 

Обратите внимание, что новая функция glob_walk() (как WLL как get_all_files()) в этой версии являются генераторами, как и os.walk().