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

2024-10-02 04:30:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

使用遥控器几乎同时启动凸轮。因此,如果视频的持续时间在彼此的1秒之内,则表示“拍摄”。你知道吗

我已经得到了所有的元数据,比如duration以毫秒为单位,file_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文件夹中”

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


Tags: name文件夹arrayfile1metafilemp4持续时间
1条回答
网友
1楼 · 发布于 2024-10-02 04:30:32

我想你用dict会比用list作为takes更快乐:

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)

它对文件的位置和去向进行了假设,不会让您知道由于太多差异而失败的获取,等等。但它应该适合你的确切要求。你知道吗

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

相关问题 更多 >

    热门问题