按照列表中存储的数字顺序查找丢失的文件名

时间:2018-11-09 19:11:12

标签: python

我有一个基于时间戳的字符串列表(date_millisecondtime.csv),如下所示:

    [..., file_20181105_110001.csv, file_20181105_120002.csv,    file_20181105_130002.csv, file_20181105_140002.csv,    file_20181105_150003.csv, file_20181105_160002.csv,    file_20181105_170002.csv, file_20181105_200002.csv,    
file_20181105_210002.csv, file_20181106_010002.csv, file_20181106_020002.csv, file_20181106_030002.csv...]

因此此处文件的日期为2018-11-05(2018年11月5日),时间戳为11、12、13、14、15、16、17、20和21。

我只想打印文件名18和19,因为它们丢失了。有效时间范围是1-23,因此,如果在给定的一天(此处为2018-11-05)在此范围内不存在小时的文件名,请打印那些丢失的小时文件。

2 个答案:

答案 0 :(得分:2)

一种解决方案是使用集合理解来提取当前时间。如果我了解您的要求,则可以计算minmax次,并与从set派生的range取差:

L = ['file_20181105_110001.csv', 'file_20181105_120002.csv', 'file_20181105_130002.csv',
     'file_20181105_140002.csv', 'file_20181105_150003.csv', 'file_20181105_160002.csv',
     'file_20181105_170002.csv', 'file_20181105_200002.csv', 'file_20181105_210002.csv']

present = {int(i.rsplit('_', 1)[-1][:2]) for i in L}

min_time, max_time = min(present), max(present)

res = set(range(min_time, max_time)) - present  # {18, 19}

然后可以从缺少的时间构建文件名。我将把它保留为练习[提示:列表理解]。

答案 1 :(得分:0)

如果您还需要检查列表开头/结尾缺少的文件(例如,小时0-10、22和23),则可以采用另一种解决方案

filenames = ['file_20181105_110001.csv', 'file_20181105_120002.csv', 'file_20181105_150003.csv']
pos = 0
for h in range(0, 23):
    n = "file_20181105_" + str(h).zfill(2)
    if pos < len(filenames) and n == filenames[pos][: len(n)]:
        print("Found", h)
        pos += 1
    else: print("Not found", h)

当然,您可以通过多种方式来构建n。如果需要,您可以创建另一个循环来运行几天。

编辑:

如果我们要检查一天以上的时间,则可以遍历检查文件/小时数的日子。

恕我直言,我建议根据使用情况,天数,文件名数量,首选项和代码样式等,对以下代码进行大量更改。

filenames = ['file_20181104_110001.csv', 'file_20181105_120002.csv', 'file_20181105_150003.csv']
pos = 0
missing = []
for d in (4, 5):
    for h in range(0, 23):
        n = "file_201811" + str(d).zfill(2) + "_" + str(h).zfill(2)
        if pos < len(filenames) and n == filenames[pos][: len(n)]:
            pos += 1
            print("Found", d, h)
        else:
            print("Not Found", d, h)