2013-05-21 50 views
0

我的腳本記錄有關目錄和子目錄中所有唯一文件類型的信息。在創建文件擴展名的唯一列表的過程中,當前代碼認爲jpg,Jpg和JPG是相同的,因此它只在列表中包括其中的一個。我如何包含所有三個或更多的差異?唯一的列表是否可以接受較低和較大的條目

for root, dirs, files in os.walk(SourceDIR, topdown=False): 
    for fl in files: 
     currentFile=os.path.join(root, fl) 
     ext=fl[fl.rfind('.')+1:] 
     if ext!='': 
      if DirLimiter in currentFile: 
       List.append(currentFile) 
       directory1=os.path.basename(os.path.normpath(currentFile[:currentFile.rfind(DirLimiter)])) 
       directory2=(currentFile[len(SourceDIR):currentFile.rfind('\\'+directory1+DirLimiter)]) 
       directory=directory2+'\\'+directory1 
       if directory not in dirList: 
        dirCount+=1 
        dirList.append(directory) 


     if ext not in extList: 
      extList.append(ext) 

完整的劇本是在stackexchange這樣一個問題:Recurse through directories and log files by file type in python

由於JennaK在進一步的調查,我發現在JPG報告輸入實際上有JPG和JPG如下的文件中。

> 44;X:\scratch\project\Input\Foreshore and Jetties Package 
> 3\487679 - Jetty\IMG_1630.JPG;3755267 
> 45;X:\scratch\project\Input\Foreshore and Jetties Package 
> 3\487679 - Jetty\IMG_1633.JPG;2447135 
> 1;X:\scratch\project\Input\649701 - Hill 
> Close\2263.jpg;405328 2;X:\scratch\project\Input\649701 - Hill Close\2264.jpg;372770 

所以它首先得到了所有的JPG文件的詳細信息,然後將JPG文件,並把它們放在一個單一的報告實際上是比有2份報告更方便。我想我的編程比我想象的要好:-)

+0

你真的需要將這些添加到列表中嗎?我的意思是在「大寫」函數可以解決你的問題之後用字符串檢查? – cerkiewny

+1

'ext不在extList'中已經是區分大小寫的比較。如果您的代碼不起作用,則問題必須在其他地方。 –

+0

@JanneKarila - 你是對的。我只是重新檢查了extList,它有所有的病例版本。我正在嘗試在代碼中稍後跟蹤該問題,並會盡快更新我的答案以反映此問題。謝謝。 – GeorgeC

回答

2

不,對於listin運算符檢查是否相等,並且字符串在使用相同大小寫時只相互相等。

您可以在此處使用一組值,並將所有directory.lower()值存儲在其中。集是(很多)更快的入會測試的名單,以及:

directories = set() 
extensions = set() 

for root, dirs, files in os.walk(SourceDIR, topdown=False): 
    # ... 
     # no need to use `directory.lower() in directories`, just update the set: 
     directories.add(directory.lower()) 

    # ... 
    extensions.add(ext.lower()) 

dirCount變量很容易得出以後:

dirCount = len(directories) 

您也想看看通過os.path提供的一些功能更多,特別是os.path.splitext(),os.path.relpath()os.path.join()功能。

你在循環中的文件處理可以簡化很多;答:

for fl in files: 
    filename = os.path.join(root, fl) 
    base, ext = os.path.splitext(filename) 
    if ext: 
     List.append(filename) 
     directory = os.path.relpath(filename, SourceDir) 
     directories.add(directory.lower()) 
     extensions.add(ext) 

請注意,我用只是os.path.relpath()這裏;你的os.path.basename()os.path.normpath()舞蹈加分隔符等等是不必要的複雜。

現在,字裏行間,似乎你只需要考慮擴展等於什麼的只是部分的情況。

在這種情況下,建立自己從os.path.splitext()結果一個新的文件名:

base, ext = os.path.splitext(filename) 
normalized_filename = base + ext.lower() 

現在normalized_filename是擴展名下降,所以你可以根據需要在臺使用該值。

+0

謝謝。我將在船上進行這些更改。根據我對這個問題的編輯,我發現這個問題確實不是問題。 – GeorgeC

+0

我的答案是否可以解釋這一點?你的代碼仍然有不必要的'.normpath()'和'.basename()'調用的問題,我能夠解決這些問題嗎? –

+0

我還沒有時間用你的建議來改進代碼 - 它可能很糟糕,但仍然有效。謝謝您的意見。 – GeorgeC