Python 3 - Leer y escribir valores en un .csv
Estoy leyendo un archivo .csv, quiero extraer ciertos valores y escribirlos en un nuevo archivo result.csv (B). Intenté hacer esto con el código (A), que solo funciona parcialmente.
En la definición, pongo todas las variables de las que quiero extraer eventualmente los valores coincidentes del archivo .csv que estoy leyendo. (excepto "record_id" y "abreviatura", porque los completaré manualmente)
Ahora, al ejecutar el código (A), genera el siguiente resultado en result.csv:
Salida de corriente
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 , , , ,
Como puede ver, faltan muchos valores en comparación con la salida deseada (B), así como algunos que se muestran, pero incorrectos.
Ahora los problemas que estoy enfrentando son los siguientes:
Problema 1
Como estoy comparando nombres en el archivo .csv que estoy leyendo, con los nombres en mi definición (A). Algunos de ellos no coinciden exactamente o se confunden con otros que tienen parcialmente el mismo nombre.
Este es el problema para:
patient_id, velocity, step_time, stride_length, swing_time, stance_time, single_supp_time, double_supp_time, toe_in_out
Por ejemplo, la velocidad de mi definición coincide con la velocidad del archivo .csv que estoy leyendo, pero también coincide con stridevelocitystddev. Esto está causando el valor faltante para la velocidad.
Problema 2
Todas las siguientes variables contienen 2 valores en lugar de 1, por ejemplo, step_time contiene el valor 0,558 y 0,554. Para todas estas variables que contienen 2 valores, quiero calcular el promedio de las dos y luego solo escribir el promedio (en este ejemplo, el promedio de 0,558 y 0,554 = 0,56) en el resultado.csv que pertenece a step_time.
step_time, step_length, cycle_time, stride_length, hh_base_support, swing_time, stance_time, single_supp_time, double_supp_time, toe_in_out
Espero que alguien pueda ayudarme a solucionar estos problemas, ¡será apreciado!
Siéntase libre de jugar con el archivo de exportación que estoy usando, puede descargarlo aquí:Archivo de exportación CSV
(A) Código de Python
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) Salida deseada .csv
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