Python 从CSV中查找重复数据,然后合并到特定架构中
上下文: 出于视频编辑的目的,我接收带有镜头名称、开始和结束时间代码的CSV。 有趣的CSV数据的格式如下: 源输入/输出需要转换为帧范围(如1-24) 所以基本上一个镜头被提取为序列('shot','framerange')像:'SQ010,('010','150-1000')。 一个序列可以(或不可以)有多个放炮,并且同一个放炮的多个时间段具有相似或不同的震源输入和输出。一个编辑(CSV)可以有多个序列 问题: 1/我无法按预期方式合并具有重叠帧范围的重复快照,即: [('SQ010',('010',0-81'),('010',10-250'),('SQ020',(…)] 如果同一个镜头的切割没有重叠,结果必须是: [('SQ010',('050','0-65,70-81'),('070','10-250'),('SQ020',(…)] 2/当我有重复的快照时,我无法运行我们后面的所有脚本,因为他们希望有唯一的快照。因此,我(目前)无法更改预期的结果格式 3/由于某些原因,列表中可能会出现一些“无”,因为我的代码中有重复的快照。我真的不明白如何避免它们 我现在能做什么: 我能够提取序列、快照、时间码并将其转换,但不能合并重复的快照时间码Python 从CSV中查找重复数据,然后合并到特定架构中,python,python-3.x,Python,Python 3.x,上下文: 出于视频编辑的目的,我接收带有镜头名称、开始和结束时间代码的CSV。 有趣的CSV数据的格式如下: 源输入/输出需要转换为帧范围(如1-24) 所以基本上一个镜头被提取为序列('shot','framerange')像:'SQ010,('010','150-1000')。 一个序列可以(或不可以)有多个放炮,并且同一个放炮的多个时间段具有相似或不同的震源输入和输出。一个编辑(CSV)可以有多个序列 问题: 1/我无法按预期方式合并具有重叠帧范围的重复快照,即: [('SQ010',(
import csv
import re
import sys
import os
with open(writeClean, 'r') as clearSL:
reader = csv.DictReader(clearSL)
data = {}
for row in reader:
for header, value in row.items():
try:
data[header].append(value)
except KeyError:
data[header] = [value]
# extract from CSV
seqLine = []
shotLine= []
for i in data['Name']:
if i.startswith('SQ') :
seq,shot=i.split('_')
seqLine.append(seq)
shotLine.append(shot)
else:
pass
fInLine=[]
durationTCtoFrame=[]
#read framerate from the first usable shot TODO: do it per shot for precision
framerate = int( float( list( set(data['Source FPS']) )[0] ) )
#convert Timecode to frame
for TC in data['Source In']:
inTCtoFrame = int(round(tcToFrames(TC,framerate)))
fInLine.append(inTCtoFrame)
for TC in data['Source Out']:
duration = int(round(tcToFrames(TC,framerate)))
durationTCtoFrame.append(duration)
fRange = ["{}-{}".format(*i) for i in zip(fInLine, fOutLine)] #merge first frame and last frame in string format usable by GCC
shotList = list(map(lambda x,y:(x,y),shotLine,fRange)) # merge shotname with framerange
#TEST - print(shotList)
seqInfo = map(lambda x,y:(x,y),seqLine,shotList) # merge sequence and shot
#TEST - print(seqInfo)
seqClean = list(set(seqInfo)) # remove duplicate with set()
seqClean.sort() # order all
#TEST - print(seqClean)
seqList = [(i,) + tuple(i[1] for i in e) for i, e in groupby(seqClean, lambda x: x[0])] #group shots per sequences
#TEST - print(seqList)
这给了我这种类型的结果:
[('SQ010',('050','0-81'),('050','0-65'),(…)]
如果有帮助,我可以提供完整的CSV
谢谢你使用
defaultdict(list)
,不要写你自己的zip()
为什么以及如何写?基本替换返回错误:TypeError:第一个参数必须是可调用的,或者无zip()
与iterables一起工作,映射(lambda x,y:(x,y),a,B)
=zip(a,B)