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".
我已经获得了所有元数据,例如以毫秒为单位的 duration
、file_name
和 camera_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”
非常感谢任何帮助,因为我有点迷失在循环和数据类型中。
我认为 dict
比 list
更快乐,因为 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)
这对文件的找到位置和去向有假设,不会让您知道因差异太大而失败的拍摄等等。但它应该适合您的具体要求。
已编辑:改进逻辑以确保检查正确的尝试次数。
我有 16 个 GoPro 摄像机同时拍摄,我正在编写一个 Python 应用程序来将 SD 卡中的视频文件复制并排序到这样的文件夹结构中:
项目
----取1
-------- cam1-file1.mp4
-------- cam2-file1.mp4
----取2
-------- cam1-file2.mp4
-------- cam2-file2.mp4
使用遥控器几乎同时启动摄像头。因此,如果视频的 duration 彼此相差不到一秒,则表示 "take".
我已经获得了所有元数据,例如以毫秒为单位的 duration
、file_name
和 camera_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”
非常感谢任何帮助,因为我有点迷失在循环和数据类型中。
我认为 dict
比 list
更快乐,因为 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)
这对文件的找到位置和去向有假设,不会让您知道因差异太大而失败的拍摄等等。但它应该适合您的具体要求。
已编辑:改进逻辑以确保检查正确的尝试次数。