2015-04-14 2 views
2

Я хочу найти md5sum файлов, начиная с «10» (может быть exe, doc, pdf и т. Д.), Следовательно, не проверяет расширение файла, а только стартовые две цифры. До сих пор я сценарий, чтобы пройти через каталог и распечатать все эти файлы, но не может получить контрольную сумму для печати для каждого из них:Найти md5 файлов рекурсивно в каталоге в python

def print_files(file_directory, file_extensions=['10']):       
''' Print files in file_directory with extensions in file_extensions, recursively. ''' 

# Get the absolute path of the file_directory parameter        
    file_directory = os.path.abspath(file_directory)          

# Get a list of files in file_directory            
    file_directory_files = os.listdir(file_directory)          

# Traverse through all files               
    for filename in file_directory_files:             
    filepath = os.path.join(file_directory, filename)         

    # Check if it's a normal file or directory           
    if os.path.isfile(filepath):              

     # Check if the file has an extension of typical video files 
     for file_extension in file_extensions:      
      # Not a reqd file, ignore        
      #if not filepath.endswith(file_extension):    
      if not filename.startswith(file_extension) or len(filename) != 19: 
       continue              

      # We have got a '10' file!     
      print_files.counter += 1           


      ## TRYING TO READ AND PRINT MD5 USING HASHLIB/ DOESNT WORK### 
      hasher = hashlib.md5()            
      with open(filename, 'rb') as afile:        
       buf = afile.read(65536)           
       while len(buf) > 0:            
        hasher.update(buf)           
        buf = afile.read(65536)          


      # Print it's name             
      print('{0}'.format(filepath))          
      print hasher('{0}.format(filepath)').hexdigest() 
      print '\n'          
    elif os.path.isdir(filepath):        
     # We got a directory, enter into it for further processing 
     print_files(filepath) 
if __name__ == '__main__':                 

# Directory argument supplied    
    if len(sys.argv) == 2:               
    if os.path.isdir(sys.argv[1]):            
     file_directory = sys.argv[1]           
    else:                  
     print('ERROR: "{0}" is not a directory.'.format(sys.argv[1]))   
     exit(1)                
else:                   
    # Set file directory to CWD     
    file_directory = os.getcwd()            

print('\n -- Looking for Required Files in "{0}" -- \n'.format(file_directory)) 

# Set the number of processed files equal to zero        
print_files.counter = 0              

# Start Processing                
print_files(file_directory)             

# We are done. Exit now. 

'

+0

Что не работает? Вызывает ли это исключение? Дать неправильный результат? Какие? –

+0

Что не работает - вы получаете сообщение об ошибке? Можете ли вы показать нам, что происходит? –

+0

Он говорит: - В поисках необходимых файлов в "/ Главная/Загрузки/10 /" - Traceback (самый последний вызов последнего): Файл "list-files.py", строка 82, в print_files (file_directory) Файл «list-files.py», строка 59, в print_files print_files (путь к файлу) Файл «list-files.py», строка 46, в print_files с открытым (имя файла, 'rb') as afile: IOError: [Errno 2] Нет такого файла или каталога: '1016328298791839266' –

ответ

3

Я рекомендовал бы, чтобы вы не решить эту проблему рекурсивно, но вместо того, чтобы использовать os.walk() для обхода структуры каталогов. Следующий код может быть телом вашей функции print_files.

file_directory = os.path.abspath(file_directory) 
paths_to_hash = [] 

for root, dirs, filenames in os.walk(file_directory, topdown=False): 
    for i, dir in enumerate(dirs): 
     for filename in filenames[i]: 
      if filenames[:2] == '10': 
       paths_to_hash += [os.path.abspath('{0}/{1}/{2}'.format(root, dir, filename)] 

for path in paths_to_hash: 
    hash = hashlib.md5(open(path, 'rb').read()).digest()) 
    print 'hash: {0} for path: {1}'.format(hash, path) 
+0

Итак, я планирую расширить этот подход до такого, чтобы передать текстовый файл, содержащий md5, и вернуть только те имена файлов, чей md5 присутствует в текстовом файле. Любой указатель. –

0

линии печати Hasher должно быть:

print('{0}'.format(hasher.hexdigest())) 
+0

Линия: "с открытым (filename, 'rb') в качестве файла:" заменить имя файла по пути к файлу. – CristiFati

0

Понял фиксируется с этой линией

print hashlib.md5(open('{0}'.format(filepath)).read()).hexdigest() 

Я не был чтении файла, но только проездом hashlib.md5. Спасибо Мэтту за понимание.

+0

Если вы нашли мой ответ полезным, пожалуйста, оставьте этот комментарий под ответом и проголосуйте за него. Благодарю. –

Смежные вопросы