I'm comparitively new to using CSV functions in python and need your help.
I have a python program that calculates distance between contours in opencv as well as angle, and this data is later stored in CSV file each time I press h on keyboard. The issue is that, each time I press h, the earlier line gets overwritten by the new line instead of saving it in new line. Is there any way I can save the new variable in new line in CSV format?
Here's part of my code. The whole code is long, so posting necessary part from it-
def calcDistHex(x6, y6, x5, y5, x4, y4, x3, y3, x2, y2, x, y):
    dist1 = round(dist.euclidean((x6, y6), (x5, y5)))
    dist2 = round(dist.euclidean((x5, y5), (x4, y4)))
    dist3 = round(dist.euclidean((x4, y4), (x3, y3)))
    dist4 = round(dist.euclidean((x3, y3), (x2, y2)))
    dist5 = round(dist.euclidean((x2, y2), (x, y)))
    dist6 = round(dist.euclidean((x, y), (x6, y6)))
    
    #print(dist1)
    cv2.putText(frame, str(dist1), (round(0.5 * x6 + 0.5 * x5), round(0.5 * y6 + 0.5 * y5)) , font, 0.5, (0, 0, 0), 1)
    cv2.putText(frame, str(dist2), (round(0.5 * x5 + 0.5 * x4), round(0.5 * y5 + 0.5 * y4)) , font, 0.5, (0, 0, 0), 1)
    cv2.putText(frame, str(dist3), (round(0.5 * x4 + 0.5 * x3), round(0.5 * y4 + 0.5 * y3)) , font, 0.5, (0, 0, 0), 1)
    cv2.putText(frame, str(dist4), (round(0.5 * x3 + 0.5 * x2), round(0.5 * y3 + 0.5 * y2)) , font, 0.5, (0, 0, 0), 1)
    cv2.putText(frame, str(dist5), (round(0.5 * x2 + 0.5 * x), round(0.5 * y2 + 0.5 * y)) , font, 0.5, (0, 0, 0), 1)
    cv2.putText(frame, str(dist6), (round(0.5 * x + 0.5 * x6), round(0.5 * y + 0.5 * y6)) , font, 0.5, (0, 0, 0), 1)
    pt6 = x6, y6
    pt5 = x5, y5
    pt4 = x4, y4
    pt3 = x3, y3
    pt2 = x2, y2
    pt1 = x, y
    
    m2 = gradient(pt2,pt1)
    n2 = gradient(pt2,pt3)
    if m2 is not None and n2 is not None:
        angR2 = math.atan((n2-m2)/(1+(n2*m2)))
        angD2 = math.degrees(angR2)
        if math.isnan(angD2) is False:
            cv2.putText(frame, str(round(abs(angD2))), (pt2[0]-40,pt2[1]-20), font, 1, (0, 0, 0))        
            #print(round(abs(angD2)),(pt1[0]-40,pt1[1]-20))
    
    m3 = gradient(pt3,pt2)
    n3 = gradient(pt3,pt4)
    if m3 is not None and n3 is not None:
        angR3 = math.atan((n3-m3)/(1+(n3*m3)))
        angD3 = math.degrees(angR3)
        if math.isnan(angD3) is False:
            cv2.putText(frame, str(round(abs(angD3))), (pt3[0]-40,pt3[1]-20), font, 1, (0, 0, 0))        
            #print(round(abs(angD3)),(pt1[0]-40,pt1[1]-20))
    
    m4 = gradient(pt4,pt3)
    n4 = gradient(pt4,pt5)
    if m4 is not None and n4 is not None:
        angR4 = math.atan((n4-m4)/(1+(n4*m4)))
        angD4 = math.degrees(angR4)
        if math.isnan(angD4) is False:
            cv2.putText(frame, str(round(abs(angD4))), (pt4[0]-40,pt4[1]-20), font, 1, (0, 0, 0))        
            #print(round(abs(angD4)),(pt1[0]-40,pt1[1]-20))
    
    m5 = gradient(pt5,pt4)
    n5 = gradient(pt5,pt6)
    if m5 is not None and n5 is not None:
        angR5 = math.atan((n5-m5)/(1+(n5*m5)))
        angD5 = math.degrees(angR5)
        if math.isnan(angD5) is False:
            cv2.putText(frame, str(round(abs(angD5))), (pt5[0]-40,pt5[1]-20), font, 1, (0, 0, 0))                
            #print(round(abs(angD5)),(pt1[0]-40,pt1[1]-20))
    
    m6 = gradient(pt6,pt5)
    n6 = gradient(pt6,pt1)
    if m6 is not None and n6 is not None:
        angR6 = math.atan((n6-m6)/(1+(n6*m6)))
        angD6 = math.degrees(angR6)
        if math.isnan(angD6) is False:
            cv2.putText(frame, str(round(abs(angD6))), (pt6[0]-40,pt6[1]-20), font, 1, (0, 0, 0))        
            #print(round(abs(angD6)),(pt1[0]-40,pt1[1]-20))
    
    m = gradient(pt1,pt6)
    n = gradient(pt1,pt2)
    if m is not None and n is not None:
        angR = math.atan((n-m)/(1+(n*m)))
        angD = math.degrees(angR)
        if math.isnan(angD) is False:
            cv2.putText(frame, str(round(abs(angD))), (pt1[0]-40,pt1[1]-20), font, 1, (0, 0, 0))                
            #print(round(abs(angD)),(pt1[0]-40,pt1[1]-20))
    if cv2.waitKey(1) == ord('h'):
            timestamp = int(time.time() * 10000)
            with open('dataset.csv', 'w', newline='') as dataset_file:
                dataset = csv.DictWriter(
                    dataset_file,
                    ["timestamp", "shape", "Side1", "Side2", "Side3", "Side4", "Side5", "Side6", "Perimeter", "Angle1", "Angle2", "Angle3", "Angle4", "Angle5", "Angle6", "AngleSum", "Error"]
                )
                dataset.writeheader()
                dataset.writerow({
                    "timestamp": timestamp,
                    "shape": "Hexagon",
                    "Side1": dist1,
                    "Side2": dist2,
                    "Side3": dist3,
                    "Side4": dist4,
                    "Side5": dist5,
                    "Side6": dist6,
                    "Perimeter": (dist1 + dist2 + dist3 + dist4 + dist5 + dist6),
                    "Angle1": angD,
                    "Angle2": angD2,
                    "Angle3": angD3,
                    "Angle4": angD4,
                    "Angle5": angD5,
                    "Angle6": angD6,
                    "AngleSum": (angD + angD2 + angD3 + angD4 + angD5 + angD6),
                    "Error": "To Do"
                })
                
    return dist1, dist2, dist3, dist4, dist5, dist6, angD, angD2, angD3, angD4, angD5, angD6;
This is the defined function which stores the file.
This function is later called in another loop -
            if len(approx) == 6:
                for j in n:
                    if(i % 2 == 0):
                        x6 = n[i - 10]
                        y6 = n[i - 9]
                        
                        x5 = n[i - 8]
                        y5 = n[i - 7]
                        x4 = n[i - 6]
                        y4 = n[i - 5]
                        x3 = n[i - 4]
                        y3 = n[i - 3]
                        
                        x2 = n[i - 2]
                        y2 = n[i - 1]
                        
                        x = n[i]
                        y = n[i + 1]
                        
                        #print(x, y, x2, y2, x3, y3, x4, y4)
                        string = str(x) + " " + str(y)
                        cv2.circle(frame, (x, y), 2, (0,0,100), 2)                            
                        cv2.putText(frame, string, (x, y), font, 0.5, (138, 138, 54), 2)
                        calcDistHex(x6, y6, x5, y5, x4, y4, x3, y3, x2, y2, x, y)
                                
                                    # text on remaining co-ordinates.
                i = i + 1
    cv2.imshow("Frame", frame)
    cv2.imshow("Mask", threshold)
Any help is appreciated. Written in python.
 
    