Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找列表中存储的序号中缺少的文件名_Python - Fatal编程技术网

Python 查找列表中存储的序号中缺少的文件名

Python 查找列表中存储的序号中缺少的文件名,python,Python,我有一个基于时间戳(date\u millisondtime.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

我有一个基于时间戳(date\u millisondtime.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)文件名中的小时数不在此范围内,请打印缺少的小时数文件。

一种解决方案是使用集合理解来提取当前时间。如果我了解您的要求,您可以计算
min
max
时间,并从
范围导出的
集合中取差值:

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}

然后可以根据丢失的时间构建文件名。我将此作为练习[提示:列表理解]。

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


一种方法是同时顺序迭代这两个文件(所需的时间戳和文件名)。为此,您需要对文件名列表进行排序,并有一个(已排序的)所有所需时间戳的列表。对于第二个输入,您可以预先计算一个列表,并以交互方式生成它。然后,遍历时间戳列表并检查文件是否存在。如果文件存在,(做点什么)并向前移动两个输入。如果不存在该时间戳的文件名(在不存在时执行操作),只向前移动带有时间戳的输入。感谢您的回复。当同一个列表中有多个日期时,假设已排序,我会在其顶部有另一个for循环?那怎么办?就像在我的例子中,我有11月5日和11月6日的日期是的,你需要在这个之外循环你想要检查的日期。我将在外部使用for循环更新答案。
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)
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)