难以永久替换从csv导入的嵌套字典中的值

时间:2017-09-14 00:38:05

标签: python-3.x csv

我(非常)不熟悉编码并尝试自动化一些操作数据的过程,作为我博士的一部分。

我有心率监测器的CSV文件,时间存储为MM:SS.s和当时的心率。 e.g。

Time, Heart_rate
00:00.6, 100
00:01.0, 102
00:01.5, 102

我已使用CSV包导入和DictReader将数据导入数组。

import csv
with open('hr_data.csv', 'rU') as infile:
    reader = csv.DictReader(infile, delimiter=',')

数据以字符串形式出现,因此我使用以下代码尝试首先将心率替换为浮点数,然后将时间(例如00:05.5 - 持续5.5秒)转换为浮点数秒。

sec = 0
for row in reader:
    row['Heart_rate'] = int(row['Heart_rate'])
    temp = row.get('Time')
    sec = (float(temp[3:7]) + (float(temp[0:2]) * 60))
    row['Time'] = sec

如果我之后打印(行)(一切都是浮点数,时间以秒为单位),这似乎有效。然而,当我向前移动以尝试将数据分成10秒的分档时,所有内容都恢复为原始字符串,我似乎无法做到:

for row in reader:
    print(row)

因为这只是打印什么......

提前致谢。

2 个答案:

答案 0 :(得分:1)

DO

with open('hr_data.csv', 'rU') as infile: reader = list(csv.DictReader(infile, delimiter=',’))

它会像你想要的那样工作。

csv.DictReader是一个生成器。它逐个遍历每一行,完成后就完成了。因为你经历了第一个for循环中的所有行,所以它已经读取了文件中的所有行,并且是空的。

要保存生成器的结果(存储所有行),请将生成器强制转换为列表。

答案 1 :(得分:0)

是的,你的计算似乎是正确的。但是,一旦离开with构造的周围,许多物品就会丢失。例如,构建reader以在此处为您提供标题;它消失了。因为它离开了,所以来自它的row的值也是如此。你需要安排在循环中保存你想要的东西。

>>> import csv
>>> times = []
>>> heart_rates = []
>>> with open('heart.csv') as heart:
...     reader = csv.DictReader(heart, skipinitialspace=True)
...     for row in reader:
...         temp = row['Time']
...         times.append(float(temp[3:7]) + (float(temp[0:2]) * 60))
...         heart_rates.append(int(row['Heart_rate']))
... 
>>> times
[0.6, 1.0, 1.5]
>>> heart_rates
[100, 102, 102]

更正:在与ddg讨论此问题后,我了解到readerwith之外仍然存在。很遗憾,虽然我无法使用reader重新阅读for row in reader;row中的行,因为with文件heart之外的文件已被关闭。