为什么我的python条件没有得到满足

时间:2016-09-21 11:08:44

标签: python

我有一个按创建日期排序的文件名列表。这些文件在文件名中包含日期时间,用于创建日期时间。我试图在一段时间后为所有文件创建一个子列表。

完整的文件列表 -

Allfilenames = ['CCN-200 data 130321055347.csv',
'CCN-200 data 130321060000.csv',
'CCN-200 data 130321063235.csv',
'CCN-200 data 130321070000.csv',
'CCN-200 data 130321080000.csv',
'CCN-200 data 130321090000.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 data 130321090000.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 data 130321080000.csv'?请注意,为清楚起见,我在此处仅显示了基本名称。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您的文件名hhmmss存在于索引19:25而不是19:24。因此,从文件名中获取hhmmss的正确语句是:

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

答案 2 :(得分: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获取文件列表,并采取相应措施,而不是使用文件名。文件名是一个字符串,即使它可以支持您使用较旧或较新的文件,但通常使用这种方式并不是一个好主意。您正在将时间戳转换为文件名的字符串。然后将此字符串转换回时间戳并在正常情况下进行转换。相反,如果您要进行文件修改时间,则只能使用日期和时间格式而不是需要完成的转换。这没什么好处:

  • 文件名或任何显式参数都可能随时间而变化,但您无需一次又一次地更改逻辑
  • 基于文件的时间戳确实存在用于这些目的。所以他们确实提供了更多控制。例如,如果您希望选择某个范围的文件,仅在特定时间段创建或修改?易于处理文件时间戳。
  • 这会将时间逻辑与文件名分开,因此您可以根据其目的更有意义地命名它们,从而简化代码在一段时间内的维护。