Python - 检查列表数据以将文件存储在文件夹结构中

Python - Check List Data to Store Files in Folder Structure

我有 16 个 GoPro 摄像机同时拍摄,我正在编写一个 Python 应用程序来将 SD 卡中的视频文件复制并排序到这样的文件夹结构中:

项目
----取1
-------- cam1-file1.mp4
-------- cam2-file1.mp4
----取2
-------- cam1-file2.mp4
-------- cam2-file2.mp4

使用遥控器几乎同时启动摄像头。因此,如果视频的 duration 彼此相差不到一秒,则表示 "take".

我已经获得了所有元数据,例如以毫秒为单位的 durationfile_namecamera_number 作为变量,但对于我来说,我无法弄清楚如何实现将这些文件存储在正确文件夹中的最终目标。

我得到了以下脚本:

for x in range(0, len(meta_array)):

    camera_number = meta_array[x][0]    # String between "01" and "16"
    file_name = meta_array[x][1]        # Filename
    duration = meta_array[x][2]         # Video length in milliseconds

    takes.append([cam,[file_name,duration_ms]])

print(takes)

输出:

[['01', ['H01-C01-NA-GOPR0150', '78840']], ['01', ['H01-C01-NA-GOPR0151', '37940']], ['02', ['H01-C02-NA-GOPR0238', '78840']], ['02', ['H01-C02-NA-GOPR0239', '37940']]]

但我想我需要更多这样的东西:

[['01', ['H01-C01-NA-GOPR0150', '78840'], ['H01-C01-NA-GOPR0151', '37940']], ['02', ['H01-C02-NA-GOPR0238', '78840'], ['H01-C02-NA-GOPR0239', '37940']]]

然后遍历整个过程并说“如果 cam1、file1 的持续时间在 cam2、file1 的持续时间的 1 秒内,将它们放入文件夹 take1

非常感谢任何帮助,因为我有点迷失在循环和数据类型中。

我认为 dictlist 更快乐,因为 takes...:[=​​15=]

import collections
takes = collections.defaultdict(list)

for x in range(0, len(meta_array)):
    camera_number = meta_array[x][0]    # String between "01" and "16"
    file_name = meta_array[x][1]        # Filename
    duration_ms = meta_array[x][2]      # Video length in milliseconds

    takes[camera_number].append([file_name, int(duration_ms)])

鉴于此,您可以继续:

all_files = [ [t[0] for t in v] for v in takes.values() ]
all_durations = [ [t[1] for t in v] for v in takes.values() ]
num_attempts = min(len(d) for d in all_durations)

successes = 0

for attempt in range(num_attempts):
    # get lengths for all cameras
    durations = [d[attempt] for d in all_durations]
    discrepancy = max(durations) - min(durations)
    if discrepancy > 1000: continue
    successes += 1
    dest_dir = 'take{}'.format(successes)
    for filename in [f[attempt] for f in all_files]:
        shutil.copy(filename, dest_dir)

这对文件的找到位置和去向有假设,不会让您知道因差异太大而失败的拍摄等等。但它应该适合您的具体要求。

已编辑:改进逻辑以确保检查正确的尝试次数。