2012-08-26 80 views
3

所以,我試圖讓自己成爲一個Python腳本,通過選定的音樂文件夾並告訴用戶特定專輯是否沒有專輯封面。它基本上通過所有的文件並檢查if file[-4:] in (".jpg",".bmp",".png"),如果是的話,它找到了一個圖片文件。只是要清楚,我的文件夾的結構是:python os.listdir()顯示受保護的文件

  • 音樂文件夾
    • 狂賣
      • Humbug的(2009)
      • 吮吸它,見(2011)
    • 嗎啡
      • 治癒疼痛(1993)

..等等。我正在測試腳本以查找Arctic Monkeys目錄中是否缺少封面,並且我的腳本通過「Humbug(2009)」文件夾並找到AlbumArtSmall.jpg which doesn't show up in the command prompt,所以我嘗試「顯示隱藏的文件/文件夾」並仍然沒有。但是,the files show up once I uncheck "Hide protected operating system files",所以這有點奇怪。

我的問題是 - 我該如何告訴Python跳過搜索隱藏/受保護的文件? 我檢出了How to ignore hidden files using os.listdir()?,但我在那裏找到的解決方案只適用於以「。」開頭的文件,而這不是我所需要的。

乾杯!


編輯 - 所以這裏的代碼:

import os 

def findCover(path, band, album): 
    print os.path.join(path, band, album) 
    coverFound = False 

    for mFile in os.listdir(os.path.join(path, band, album)): 
     if mFile[-4:] in (".jpg",".bmp",".png"): 
      print "Cover file found - %s." % mFile 
      coverFound = True 
      return coverFound 

musicFolder = "E:\Music" #for example 
noCovers = [] 

for band in os.listdir(musicFolder): #iterate over bands inside the music folder 
    if band[0:] == "Arctic Monkeys": #only Arctic Monkeys 
     print band 
     bandFolder = os.path.join(musicFolder, band) 
     for album in os.listdir(bandFolder): 
      if os.path.isdir(os.path.join(bandFolder,album)): 
       if findCover(musicFolder, band, album): #if cover found 
        pass        #do nothing 
       else: 
        print "Cover not found" 
        noCovers.append(band+" - "+album) #append to list 
      else:      #if bandFolder is not actually a folder 
       pass 
     print "" 
+0

一個正確的答案將取決於你如何穿過你的目錄,但是,你有沒有想過用[os.stat]檢查文件模式(http://docs.python.org/library /os.html#os.stat)? –

+0

我已經添加了代碼,希望有所幫助。無論如何,我嘗試了'os.stat(「Folder.jpg」)',這是我得到的: 'nt.stat_result(st_mode = 33206,st_ino = 0L,st_dev = 0,st_nlink = 0,st_uid = 0, st_gid = 0,st_size = 34820L,st_atime = 1315277420L,st_mtime = 1259528972L,st_ctime = 1259525728L)'。我不確定哪些值告訴我該文件是「受保護」或「隱藏」的。嗯。 –

+0

對可見的.mp3文件執行os.stat()會返回幾乎相同的值:'nt.stat_result(st_mode = 33206,st_ino = 0L,st_dev = 0,st_nlink = 0,st_uid = 0,st_gid = 0,st_size = 8379620L,st_atime = 1315277422L,st_mtime = 1259529036L,st_ctime = 1250607460L)'。 –

回答

1

你可以用pywin32 module使用,並手動測試FILE_ATTRIBUTE_HIDDEN或任意數量的屬性

FILE_ATTRIBUTE_ARCHIVE    = 32 
FILE_ATTRIBUTE_ATOMIC_WRITE   = 512 
FILE_ATTRIBUTE_COMPRESSED   = 2048 
FILE_ATTRIBUTE_DEVICE    = 64 
FILE_ATTRIBUTE_DIRECTORY   = 16 
FILE_ATTRIBUTE_ENCRYPTED   = 16384 
FILE_ATTRIBUTE_HIDDEN    = 2 
FILE_ATTRIBUTE_NORMAL    = 128 
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192 
FILE_ATTRIBUTE_OFFLINE    = 4096 
FILE_ATTRIBUTE_READONLY    = 1 
FILE_ATTRIBUTE_REPARSE_POINT  = 1024 
FILE_ATTRIBUTE_SPARSE_FILE   = 512 
FILE_ATTRIBUTE_SYSTEM    = 4 
FILE_ATTRIBUTE_TEMPORARY   = 256 
FILE_ATTRIBUTE_VIRTUAL    = 65536 
FILE_ATTRIBUTE_XACTION_WRITE  = 1024 

像這樣:

import win32api, win32con 

#test for a certain type of attribute 
attribute = win32api.GetFileAttributes(filepath) 
#The file attributes are bitflags, so you want to see if a given flag is 1. 
# (AKA if it can fit inside the binary number or not) 
# 38 in binary is 100110 which means that 2, 4 and 32 are 'enabled', so we're checking for that 
## Thanks to Nneoneo 
if attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM): 
    raise Exception("hidden file") #or whatever 

#or alter them 
win32api.SetFileAttributes(filepath, win32con.FILE_ATTRIBUTE_NORMAL) #or FILE_ATTRIBUTE_HIDDEN 

更改文件後,請查看文件夾中的文件,它不會再被隱藏。

發現這個信息here這裏:Checking file attributes in python


或者,你可以嘗試使用os.stat函數,它的文檔here然後使用stat module進一步瞭解你在尋找什麼。

發現了這些相關問題。 (python) meaning of st_modeHow can I get a file's permission mask?

+0

您是否正面反映了Windows認爲「受保護的系統文件」?我有一種感覺,那就是一種定製機制。 – jdi

+0

@jdi進行更改以檢查系統隱藏文件。希望這對他有用。我實際上並不確定'受保護的系統文件'的正確名稱是......可能是'FILE_ATTRIBUTE_SYSTEM',但我沒有測試過它。 – TankorSmash

+0

@TankorSmash,男士,感謝所有的幫助,我欣賞它=)起初它沒有按照它應有的方式工作。例如,當我運行你的代碼時,'if'條件是'False',因爲值不相等 - 'attribute = 38'和'win32con.FILE_ATTRIBUTE_HIDDEN = 2'。因此,'win32api.GetFileAttributes(HiddenFile)'返回'38',而可見文件的值爲'32'。將if條件改爲'if attribute == 38'就是這樣。玩過'win32api.SetFileAttributes'並且按照它的設計工作。非常好的人,謝謝你的幫助,你搖滾! –