2016-03-14 182 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