我对Python文件名模式定义规则有疑问。
我下面有很多文件。我需要按日期格式过滤掉这些文件,我不想使用((_))分割。
我的解决方案
src_format = "TrackLog_%Y%m%d_*.csv"
dst_exist_dates = [datetime.strptime(f, 'TrackLog_%Y%m%d_*.csv') for f in s3.list_files_as_list(s3_profile, src_path, recursive=True)]
2017-10-05 04:23:39 969083134 TrackLog_20171004_070602.csv
2017-10-06 04:23:52 986127990 TrackLog_20171005_070555.csv
2017-10-07 04:26:09 991914033 TrackLog_20171006_070929.csv
2017-10-08 04:24:51 996154180 TrackLog_20171007_070656.csv
2017-10-09 04:23:02 998725794 TrackLog_20171008_070647.csv
2017-10-10 04:24:49 1002421079 TrackLog_20171009_070550.csv
2017-10-11 04:25:51 1008595262 TrackLog_20171010_070553.csv
2017-10-12 04:24:04 1015542121 TrackLog_20171011_070555.csv
2017-10-13 04:24:06 1041053623 TrackLog_20171012_070620.csv
2017-10-14 04:26:59 1049256243 TrackLog_20171013_070929.csv
但是我有一个例外,好像我的模式不正确,有人可以帮助我吗?非常感谢
ValueError: time data 'TrackLog_20160315_123456.csv' does not match format 'TrackLog_%Y%m%d_*.csv'
答案 0 :(得分:1)
您可以使用string slicing
。
例如:
import datetime
s = 'TrackLog_20160315_123456.csv'
print( datetime.datetime.strptime(s[9:17], '%Y%m%d') )
在您的情况下:
dst_exist_dates = [datetime.strptime(f[9:17], '%Y%m%d') for f in s3.list_files_as_list(s3_profile, src_path, recursive=True)]
输出:
2016-03-15 00:00:00
答案 1 :(得分:0)
strptime
不支持全局模式,因此不能将*
用作通配符。而是使用re.match
获取文件名的日期部分,然后让strptime
解析日期。
将解析行更改为以下内容(在导入re
之后):
dst_exist_dates = [datetime.strptime(re.match(r'[^_]+_([^_]+)_', f).group(1), '%Y%m%d') for f in s3.list_files_as_list(s3_profile, src_path, recursive=True)]