2016-06-29 3 views
0

Новое на python, извинения, если это простой вопрос. Я немного искал и нашел много на поиск файлов с неизвестным именем и известным расширением файла, но не с известным именем и неизвестным расширением, и если никто не возражает, я мог бы немного помочь получить код для правильной работы.Python Search for File Unknown Extension

То, что я пытаюсь написать, это функция Python, которая принимает каталог и имя, а затем возвращает список с указанием пути ко всем файлам (с любым расширением файла) и каталогам с этим именем. Параметром каталога будет компьютерный диск (например, C или F), а параметр name - это имя (без расширения) файла для поиска.

Ниже приведен код, который у меня есть:

import os 
import glob 
def search_directory(directory,name): 
    result = [] 
    for root,dirs,files in os.walk(directory,topdown=True): 
     files_lower = [] 
     dirs_lower = [] 
     for i in files: 
      files_lower.append(i.lower()) 
     for i in dirs: 
      dirs_lower.append(i.lower()) 
     for i in glob.glob(name + '.*'): 
      if i.lower() in files_lower: 
       result.append(root + "\\" + files[files_lower.index(i.lower())]) 
     if name.lower() in dirs_lower: 
      result.append(root + "\\" + dirs[dirs_lower.index(name.lower())]) 
    if (len(result) == 0): 
     result.append("fileNotFound") 
    return result 

В настоящее время я только смог найти результаты, если копия файла находится в директории моей программы. Если там нет копии, он не находит файл, хотя на моем диске есть две копии.

Я надеялся, что кто-нибудь может объяснить мне, почему это так и как его исправить, чтобы он всегда находил файлы, которые я ищу.

ответ

2

Почему вы ищете для поиска? Это означает, что вы в конечном итоге повторно просматриваете каталоги, когда os.walk дает вам имена, поэтому вы можете просто проверить их напрямую, используя os.path.splitext, чтобы выполнить расщепление расширений. Кроме того, можно упростить логику, сделав его функциональным генератором, поэтому вы уступаете файлы, как вы их найдете, получать результаты быстрее и избежать ненужного состояния, когда вы обрабатываете каждое имя файла и выбросить:

def search_directory(directory,name): 
    name = name.lower() # Convert up front in case it's pass mixed case 
    for root, dirs, files in os.walk(directory,topdown=True): 
     for e in files + dirs: 
      if os.path.splitext(e)[0].lower() == name: 
       yield os.path.join(root, e) 

Это делает это генератор (если вам нужен список, вы бы обернули вызов в конструкторе list для реализации генератора), поэтому он не говорит вам, что не было хитов, но вызывающий (или функция обертывания, которая преобразуется в list) могут сами определить это. Если вам нужно, простое логическое значение инициализируется до False, которое устанавливается в True до yield. Возможно, вы можете сделать одну и ту же проверку, хотя обычно функция полезности не нуждается в том, чтобы беспокоиться о таких вещах.

+0

Чтобы быть ясным, причина, по которой у вас возникли проблемы, заключается в том, что 'glob.glob (name + '. *')' Всегда пересматривает корневой каталог, потому что вы не добавили каталог, в который вы вошли. Но это своего рода глупый дизайн, несмотря на то, что мой ответ полностью обходит проблему. – ShadowRanger

+0

Спасибо! Я ценю помощь! Я не думал о том, чтобы отделить расширение, хотя в ретроспективе это намного проще. И я довольно новичок в программировании, поэтому я не знал о генераторах или сопрограммах, поэтому я тоже это ценю. Еще одна вещь, чтобы добавить в свой инструментарий :) – tvr2006