Загрузите CSV прямо в анализатор Python CSV - PullRequest
3 голосов
/ 02 октября 2011

Я пытаюсь загрузить CSV-контент с morningstar, а затем проанализировать его содержимое.Если я вставлю содержимое HTTP непосредственно в анализатор CSV Python, результат будет отформатирован неправильно.Тем не менее, если я сохраню содержимое HTTP в файл (/tmp/tmp.csv), а затем импортирую файл в синтаксический анализатор Python, результат будет правильным.Другими словами, почему:

def finDownload(code,report):
    h = httplib2.Http('.cache')
    url = 'http://financials.morningstar.com/ajax/ReportProcess4CSV.html?t=' + code + '&region=AUS&culture=en_us&reportType='+ report + '&period=12&dataType=A&order=asc&columnYear=5&rounding=1&view=raw&productCode=usa&denominatorView=raw&number=1'
    headers, data = h.request(url)
    return data

balancesheet = csv.reader(finDownload('FGE','is'))
for row in balancesheet:
    print row

возвращает:

['F']
['o']
['r']
['g']
['e']
[' ']
['G']
['r']
['o']
['u']
     (etc...)

вместо:

[Forge Group Limited (FGE) Income Statement']

?

1 Ответ

9 голосов
/ 02 октября 2011

Проблема возникает из-за того, что итерация по файлу выполняется построчно, тогда как итерация по строке выполняется посимвольно.

Вы хотите StringIO / cStringIO (Python 2) или io.StringIO (Python 3, спасибо John Machin за указание на это), поэтому строку можно рассматривать как файлоподобныйобъект:

Python 2:

mystring = 'a,"b\nb",c\n1,2,3'
import cStringIO
csvio = cStringIO.StringIO(mystring)
mycsv = csv.reader(csvio)

Python 3 :

mystring = 'a,"b\nb",c\n1,2,3'
import io
csvio = io.StringIO(mystring, newline="")
mycsv = csv.reader(csvio)

Оба будут правильно сохранять переводы строк внутрицитируемые поля:

>>> for row in mycsv: print(row)
...
['a', 'b\nb', 'c']
['1', '2', '3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...