2014-09-06 72 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瞭解更多信息。