2016-03-14 287 views
0

我是Python的新手,對庫的使用經驗不多。 我試圖從'www.bankofcanada.com'使用「請求」模塊爲我的貨幣轉換程序獲取一個CSV文件。我想讀取該文件並解析它以獲取貨幣及其比率,在字典中使用它們。 這兩個部分,單獨工作就好(我可以得到CSV文件並保存它,並且我可以根據需要解析CSV文件,當有文件時)。我的問題是他們不一起工作,並給我空的結果: (閱讀csv文件時遇到問題

import requests 
import csv 
import os 
import time 

rates = { 


     } 

os.chdir('C:\\Users\\Caroline\\Desktop') 
res = requests.get("http://www.bankofcanada.ca/en/markets/csv/exchange_eng.csv") 
csvFile = open('csvFile2.csv','wb') 
for chunk in res.iter_content(10000): 
    csvFile.write(chunk) 
fh = open('csvFile2.csv') 
fileReader = csv.reader(fh) 
fileData = list(fileReader) 
actual_data = fileData[7:] 
for rows in actual_data: 
    rates[rows[0]] = rows[-1] 


print(rates) 

PS:我知道喜歡不使用絕對路徑,並有很多改進的代碼... 這只是debuggin目的

+0

你是什麼意思的「空結果」?你的代碼爲我創建了一個非空的csv文件。你確定你正在檢查正確目錄下的文件嗎? – ayhan

+0

爲什麼期望通過'exchange_eng.csv'名稱下載的文件只會打開文件名爲'csvFile2.csv'的文件? –

+0

@ayhan 它應該是這樣的:{'牙買加元':'0.01092','哥倫比亞比索':'0.000418',...} 但是當我打印率時,它是一個空的字典 –

回答

1

您沒有寫入後關閉文件所以沒有什麼可讀的,你需要爲所有的文件操作完成*。使用with open表單讓Python處理這個utomatically:

with open('csvFile2.csv','wb') as csvfile: 
    for chunk in res.iter_content(10000): 
     csvFile.write(chunk) 
with open('csvFile2.csv') as fh: 
    fileReader = csv.reader(fh) 

下面是等效的代碼手動關閉文件句柄:

csvFile = open('csvFile2.csv','wb') 
for chunk in res.iter_content(10000): 
    csvFile.write(chunk) 
csvFile.close() 
fh = open('csvFile2.csv') 
fileReader = csv.reader(fh) 
fh.close() 

正如你可以看到它的長與密切。開放的格式也更​​安全,因爲如果你手動執行它,容易忘記關閉文件處理程序。

Python有許多很好的語言特性,旨在使開發人員的生活更輕鬆,而這些特性並不一定與其他語言具有直接的等價關係。值得了解它們。人們談論'Idomatic Python'(作爲一件好事),他們所說的一件事就是使用這些內置的快捷方式,而不是自己滾動。

*文件需要打開關閉,以便它們可以安全地寫入(並讀取)。作爲一個用戶,關閉總是爲我們處理,所以很容易只考慮打開一個文件,而作爲程序員我們處理較低級別的操作。當你寫入一個文件時,直到你關閉該文件時,實際上沒有任何東西被寫入它,儘管看起來你是在循環中一次寫入一行。這有助於防止文件內容被其他進程破壞。

+0

您的診斷是正確的,但如果您首先使用close()來給出等效代碼,問題就會變得更加清晰。 – alexis

+0

謝謝......實際工作。 你能解釋一下爲什麼會發生這種情況嗎? 爲什麼我必須把fh.close()放在fileData = list(fileReader)之後? –

+0

@ Caroline.M最好的做法是使用上下文處理程序('with'語句)在退出'with'塊時自動管理文件的關閉。處理這些資源時,通常會使異常處理行爲正確。 – AChampion