我有一个按创建日期排序的文件名列表。这些文件在文件名中包含日期时间,用于创建日期时间。我试图在一段时间后为所有文件创建一个子列表。
完整的文件列表 -
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'?请注意,为清楚起见,我在此处仅显示了基本名称。
答案 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.stat
或os.path.getmtime
获取文件列表,并采取相应措施,而不是使用文件名。文件名是一个字符串,即使它可以支持您使用较旧或较新的文件,但通常使用这种方式并不是一个好主意。您正在将时间戳转换为文件名的字符串。然后将此字符串转换回时间戳并在正常情况下进行转换。相反,如果您要进行文件修改时间,则只能使用日期和时间格式而不是需要完成的转换。这没什么好处: