在python目录中递归查找md5文件

时间:2015-04-14 18:26:18

标签: python hash md5 hashlib

我想找到以" 10"开头的文件的md5sum。 (可能是exe,doc,pdf等)因此不检查文件扩展名但只检查开头两位数。到目前为止,我有一个脚本遍历目录并打印出所有这些文件,但无法为每个文件打印校验和:

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.   

'

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

打印垫圈的线应为:

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

答案 2 :(得分:0)

用这一行解决了这个问题

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

我没有读取文件,只是传递了hashlib.md5。感谢Matt的见解。