Python 从CSV中查找重复数据,然后合并到特定架构中

Python 从CSV中查找重复数据,然后合并到特定架构中,python,python-3.x,Python,Python 3.x,上下文: 出于视频编辑的目的,我接收带有镜头名称、开始和结束时间代码的CSV。 有趣的CSV数据的格式如下: 源输入/输出需要转换为帧范围(如1-24) 所以基本上一个镜头被提取为序列('shot','framerange')像:'SQ010,('010','150-1000')。 一个序列可以(或不可以)有多个放炮,并且同一个放炮的多个时间段具有相似或不同的震源输入和输出。一个编辑(CSV)可以有多个序列 问题: 1/我无法按预期方式合并具有重叠帧范围的重复快照,即: [('SQ010',(

上下文:

出于视频编辑的目的,我接收带有镜头名称、开始和结束时间代码的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/由于某些原因,列表中可能会出现一些“无”,因为我的代码中有重复的快照。我真的不明白如何避免它们

我现在能做什么:

我能够提取序列、快照、时间码并将其转换,但不能合并重复的快照时间码

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)