2016-09-21 51 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