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