Python 3 - Lesen und Schreiben von Werten in eine .csv

Ich lese eine CSV-Datei, möchte bestimmte Werte daraus extrahieren und diese in eine neue Datei result.csv (B) schreiben. Ich habe versucht, dies mit dem Code (A) zu tun, der nur teilweise funktioniert.

In der Definition habe ich alle Variablen, aus denen ich eventuell die passenden Werte extrahieren möchte, aus der CSV-Datei, die ich gerade lese, eingetragen. (außer "record_id" und "abbreviation", da ich diese manuell ausfülle)

Wenn Sie jetzt Code (A) ausführen, wird die folgende Ausgabe in der Datei result.csv generiert:

Aktueller Outpu

record_id  abbreviation  patient_id  step_count  distance  ambulation_time  velocity  cadence  normalized_velocity  step_time_differential  step_length_differential  cycle_time_differential  step_time  step_length  step_extremity  cycle_time  stride_length  hh_base_support  swing_time  stance_time  single_supp_time  double_supp_time  toe_in_out 
70520161453                          3           292,34    1,67             ,         107,8    ,                    0,004                   1,051                     0,008                    ,          96,746       ,               1,116       ,              2,988            ,           ,            ,                 ,

Wie Sie sehen können, fehlen viele Werte im Vergleich zur gewünschten Ausgabe (B) sowie einige, die angezeigt werden, aber falsch sind.

Nun, die Probleme, denen ich gegenüberstehe, sind wie folgt:

Problem 1

Seit ich Namen in der CSV-Datei, die ich lese, mit den Namen in meiner Definition (A) vergleiche. Einige von ihnen stimmen nicht genau überein oder werden mit anderen verwechselt, die teilweise den gleichen Namen haben.

Dies ist das Problem für:

patient_id, velocity, step_time, stride_length, swing_time, stance_time, single_supp_time, double_supp_time, toe_in_out

Zum Beispiel stimmt die Geschwindigkeit aus meiner Definition mit der Geschwindigkeit aus der CSV-Datei überein, die ich gerade lese, aber sie stimmt auch mit stridevelocitystddev überein. Dies verursacht den fehlenden Wert für die Geschwindigkeit.

Problem 2

Alle folgenden Variablen enthalten 2 Werte anstelle von 1, zum Beispiel enthält step_time den Wert 0,558 & 0,554. Für alle diese Variablen mit 2 Werten möchte ich den Durchschnitt der beiden berechnen und dann nur den Durchschnitt (in diesem Beispiel den Durchschnitt von 0,558 und 0,554 = 0,56) in die zu step_time gehörende result.csv schreiben.

step_time, step_length, cycle_time, stride_length, hh_base_support, swing_time, stance_time, single_supp_time, double_supp_time, toe_in_out

Hoffentlich kann mir jemand helfen, diese Probleme zu beheben, wird geschätzt!

Fühlen Sie sich frei, mit der von mir verwendeten Exportdatei zu spielen. Sie können sie hier herunterladen:CSV-Exportdatei

(A) Python-Code

import csv
from collections import defaultdict
from datetime import datetime

data = defaultdict(str)
result = 'path/to/file/result_%s.csv'%datetime.now().strftime('%b-%d-%Y_%H%M')

#Make a list with the predefined variables
definition = ["record_id", "abbreviation", "patient_id", "step_count", "distance", "ambulation_time", "velocity", "cadence", "normalized_velocity", "step_time_differential", "step_length_differential", "cycle_time_differential", "step_time", "step_length", "step_extremity", "cycle_time", "stride_length", "hh_base_support", "swing_time", "stance_time", "single_supp_time", "double_supp_time", "toe_in_out"]

#Read the GaitRite .csv
with open('path/to/file/Export 4.csv', 'r') as f, open(result, 'w') as outfile:
    reader = csv.reader(f, delimiter=';')
    next(reader, None)  # skip the headers
    writer = csv.DictWriter(outfile, fieldnames=definition, lineterminator='\n')
    writer.writeheader()

#Read the .csv row by row
    for row in reader:
        for item in definition:
            h = item.replace('_', '')
            r0 = row[0].lower().replace(' ', '')
            if h in r0:
                try:
                    avg = round((float(row[1].replace(',', '.')) + float(row[2].replace(',', '.'))) / 2, 2)
                    data[item] = avg
                except ValueError:
                    avg = 0  # for cases with entry strings or commas
                data[item] = row[1]

    data['record_id'] = datetime.now().strftime('%m%d%Y%H%M')

# Write the clean result.csv
    writer.writerow(data)

(B) Gewünschte CSV-Ausgabe

record_id  abbreviation  patient_id  step_count  distance  ambulation_time  velocity  cadence  normalized_velocity  step_time_differential  step_length_differential  cycle_time_differential  step_time  step_length  step_extremity  cycle_time  stride_length  hh_base_support  swing_time  stance_time  single_supp_time  double_supp_time  toe_in_out 
70520161453              25          3           292,34    1,67             175,1     107,8                         0,004                   1,051                     0,008                    0,56       97,27                        1,11        194,64         4,65             0,47        0,65         0,47              0,18              1,45