2014-09-06 39 views
1

我试图创建一个脚本来检查我的下载目录中的所有文件与常见文件类型,然后告诉我该目录中有多少文件不是GIF或JPG文件。我对基本的Python很熟悉,但这是我第一次尝试这样的事情,我正在寻找一些帮助或正确方向的一点?检测常见文件类型

file_sigs = {'\xFF\xD8\xFF':('JPEG','jpg'), '\x47\x49\x46':('GIF','gif')} 

def readFile(): 
    filename = r'c:/temp/downloads' 
    fh = open(filename, 'r') 
    file_sig = fh.read(3) 

print '[*] check_sig() File:',filename #, 'Hash Sig:', 
binascii.hexlify(file_sig) 
+0

我想你会以错误的方式去做。我建议os.walk()和endswith()函数。 – 2014-09-06 21:12:58

+0

我想依靠查看文件的前几个字节来确定类型......不仅仅是文件扩展名... – 2014-09-08 08:11:50

回答

0

您可以使用listdir找到的所有文件和Counter计算每个文件类型的总数并传入你想从文件总量

import os,os.path 
from collections import Counter 

def find_files(pth,*args): 
    c = Counter((os.path.splitext(name)[1][1:] for name in os.listdir(pth) if os.path.isfile(name))) 
    total = sum(c.values()) 
    spec_tot = sum(c.get(arg,0) for arg in args) 
    return total - spec_tot 
print(find_files(r'c:/temp/downloads' ,'JPEG','jpg','GIF','gif')) 

你的计数器减去任何扩展字典将看起来像Counter({'txt': 9, 'py': 3, 'pyc': 3, 'json': 1, 'py~': 1})

total = sum(c.values())获取文件总量。

spec_tot = sum(c.get(arg,0) for arg in args)获取以*args传入的每个文件扩展名的总和。

return total - spec_tot会给你所有的文件减去你想忽略的扩展名。

1

另一种选择,使用imghdr图书馆看文件的标题(它会处理标题检查你),会是这样的(相应地调整你的根路径):

#!/usr/bin/env python 

import os 
from os.path import join 
import imghdr 

stats = {'imgs': 0, 'nonimgs': 0} 

for dirpath, dirnames, filenames in os.walk('/home/user/Downloads'): 
    for name in filenames: 
     fullPath = os.path.join(dirpath, name) 
     fileType = imghdr.what(fullPath) 

     if fileType in ('gif', 'jpeg'): 
      stats['imgs'] += 1 
     else: 
      stats['nonimgs'] += 1 

     print "File: {0}, type: {1}".format(fullPath, fileType) 

print "non images: {0}".format(stats['nonimgs']) 
print "images: {0}".format(stats['imgs']) 

查看imghdr doc了解更多信息。