2016-03-14 2 views
0

Я новичок в Python, и у меня нет большого опыта работы с библиотеками. Я пытаюсь получить CSV-файл с «www.bankofcanada.com», используя модуль «запросы» для моей программы конвертации валют. Я хочу прочитать файл и проанализировать его, чтобы получить валюту и ее отношение, для использования их в словаре. 2 части, индивидуально работают просто отлично (я могу получить файл 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', 'Colombian peso': '0.000418', ...} , но когда скорость печати Im, это пустой словарь –

ответ

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' statement) для автоматического управления закрытием файла при выходе из блока' with'. Как правило, обработка исключений ведет себя правильно при работе с этими ресурсами. – AChampion

Смежные вопросы