2017-09-14 37 views
1

我對編碼非常陌生,並試圖自動執行某些用於操作數據的過程,作爲我的博士學位的一部分。難以永久替換從csv導入的嵌套字典中的值

我有一個心率監視器的CSV文件,當時存儲爲MM:SS.s和心率。例如

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) 

,因爲這只是打印什麼...

提前致謝。

+0

請發佈您的完整代碼。清楚「with」塊中的內容以及沒有的內容是非常沒有用的。此外,如果沒有周圍的背景,「然後當我然後嘗試...」的短語變得不那麼有意義。 –

回答

1

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

,它會像你想要的。

csv.DictReader是發電機。它通過一行一行地完成每一行,並在完成時完成。因爲您經歷了第一個for循環中的所有行,它已經讀取了文件中的所有行,並且是空的。

要保存一個生成器的結果(存儲全部這些行)將生成器強制轉換爲列表。

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我已經瞭解到,reader持續的with之外討論這個。不幸的是,雖然我無法使用for row in reader;row重新讀取reader中的行,因爲with之外的文件heart已關閉。

+0

把'''留在'''上只能刪除主變量,在這種情況下'''心臟'''。在'''和'''內分配的其他變量將被保留。 – ddg

+0

@ddg,請您詳細介紹一下。我不明白。 –

+0

在'''with'''中定義的項目在離開時不會丟失。 [示例在這裏](https://gist.github。com/DylanDmitri/f431699380ae85adc3524ebeb03ea4da) – ddg