Python 3 - 阅读&将值写入.csv

时间:2016-07-05 14:38:29

标签: python-3.x average export-to-csv

我正在读取.csv文件,想要从中提取某些值并将它们写入新的result.csv(B)文件。我尝试用代码(A)做这个,这只是部分工作。

在定义中我把我想要最终从我正在阅读的.csv文件中提取匹配值的所有变量放入。 (“record_id”和“缩写”除外,因为我会手动填写这些内容)

现在通过运行代码(A),它在result.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                          3           292,34    1,67             ,         107,8    ,                    0,004                   1,051                     0,008                    ,          96,746       ,               1,116       ,              2,988            ,           ,            ,                 ,

正如您所看到的,与所需的输出(B)相比,有许多值缺失,以及显示的一些,但不正确。

现在我遇到的问题如下:

问题1

因为我正在阅读我正在阅读的.csv文件中的名称,以及我的定义(A)中的名称。其中一些不完全匹配,或与部分具有相同名称的其他人混淆。

这是问题所在:

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

例如,我的定义中的速度与我正在阅读的.csv文件中的速度匹配,但它也与stridevelocitystddev匹配。这导致速度缺失值。

问题2

以下所有变量都包含2个值而不是1,例如step_time包含值0,558& 0554。对于包含2个值的所有这些变量,我想计算两者的平均值,然后只将平均值(在本例中为平均值0,558和0.554 = 0,56)写入属于step_time的result.csv。 / p>

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

希望有人能帮助我解决这些问题,将不胜感激!

随意使用我正在使用的导出文件,您可以在此处下载: CSV export file

(A)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)所需的.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

0 个答案:

没有答案