2016-09-21 83 views
0

我有一個按創建日期排序的文件名列表。這些文件在其創建日期時間的文件名中包含一個日期時間。我試圖在一段時間後爲所有文件創建一個子列表。爲什麼我的條件在Python中不被滿足

全部文件列表 -

Allfilenames = ['CCN-200 data55347.csv', 
'CCN-200 data60000.csv', 
'CCN-200 data63235.csv', 
'CCN-200 data70000.csv', 
'CCN-200 data80000.csv', 
'CCN-200 data90000.csv', 
'CCN-200 data 130321100000.csv', 
'CCN-200 data 130321110000.csv', 
'CCN-200 data 130321120000.csv', 
'CCN-200 data 130321130000.csv', 
'CCN-200 data 130321140000.csv', 
'CCN-200 data 130321150000.csv'] 

positions [19:24]給格式HHMMSS時間。我使用

filenames = [s for s in Allfilenames if os.path.basename(s)[19:24] >= TOffRound] 

TOffRound = "080000" 

結果應該是日或之後或08:00:00創建的所有文件名列表,但是結果列表中缺少「080000」的文件。

filenames = ['CCN-200 data90000.csv', 
'CCN-200 data 130321100000.csv', 
'CCN-200 data 130321110000.csv', 
'CCN-200 data 130321120000.csv', 
'CCN-200 data 130321130000.csv', 
'CCN-200 data 130321140000.csv', 
'CCN-200 data 130321150000.csv'] 

爲什麼沒有條件,條件的部分=返回true,在我的名單返回「CCN-200數據80000.csv」?請注意,爲了清晰起見,我只在這裏顯示了基本名稱。

+1

因爲你比較字符串就好像它們是整數。 – DeepSpace

+0

我想你應該在列表集合之前設置'TOffRound' –

+4

Look:'[所有文件名中的[os.path.basename(s)[19:24]] ['05534','06000','06323', '07000','08000','09000','10000','11000','12000','13000','14000','15000']。你必須使用25,而不是24. –

回答

0

在您的文件名hhmmss存在索引19:25而不是19:24。所以,正確的說法從文件名獲得hhmmss是:

filenames = [s for s in Allfilenames if os.path.basename(s)[19:25] >= TOffRound] 
1

檢查時間部分作爲字符串,而不是,我會建議一個更強有力的方法來測試你的文件名部分時間。這包括提取文件名的日期部分,檢索時間值並將它作爲時間對象在您指定的時間進行比較。

import re 
import datetime 

TOffRound = datetime.time(8, 0) 
filenames = [] 

for s in Allfilenames: 
    datestr = re.search("[\d]{12}", s).group(0) 
    dateobj = datetime.datetime.strptime(datestr,"%y%m%d%H%M%S") 
    timeobj = dateobj.time() 
    if timeobj >= TOffRound: 
    filenames.append(s) 
0

正如其他人所建議的,給出的代碼存在的問題是您缺少最後一位數字。在切分列表方面,不考慮在:之後給出的「停止」數字。

(eg): 
>> a = "hello world" 
>> print a[0:4] 
hell 
>> print a[0:5] 
hello 

因此,更改代碼中的這一行,你是好去:

filenames = [s for s in Allfilenames if os.path.basename(s)[19:25] >= TOffRound] 

但是,你在做什麼完全不規模。這不易於維護,也不適用於任何稍有不同的文件。代碼可以這樣轉換:

def filter_files(file_list, TOffRound): 
    text_length = len(TOffRound) 
    return [file_name for file_name in file_list if file_name[-text_length:] >= TOffRound] 

這將工作,不管文件名的大小如何。

我還建議您根據修改時間獲取文件列表,這些修改時間可以使用os.statos.path.getmtime,然後相應地執行,而不是使用文件名。文件名是一個字符串,儘管它可以支持較舊或較新的文件,但通常使用這種方式並不是一個好主意。您正在將時間戳轉換爲文件名的字符串。然後這個字符串被轉換回時間戳並在正常情況下轉換。相反,如果您需要修改文件時間,則只能使用日期和時間格式,而不是需要完成的轉換。這有幾個優點:

  • 文件名或任何明確的參數可以隨着時間而改變,但你不必再次更改邏輯和再次
  • 基於文件的時間戳確實存在這些類型的目的。所以他們確實提供更多的控制。例如,如果您希望選擇僅在特定時間段創建或修改的特定範圍的文件,易於使用文件時間戳。
  • 這將從文件名中分割時間邏輯,因此您可以根據其目的更有意義地命名它們,從而簡化代碼在一段時間內的維護。
+0

非常感謝,我會看看使用修改日期的更穩健的方法。 – JTee