• 15

A PHP Error was encountered

Severity: Notice

Message: Undefined index: userid

Filename: views/question.php

Line Number: 191


File: /home/prodcxja/public_html/questions/application/views/question.php
Line: 191
Function: _error_handler

File: /home/prodcxja/public_html/questions/application/controllers/Questions.php
Line: 433
Function: view

File: /home/prodcxja/public_html/questions/index.php
Line: 315
Function: require_once

name Punditsdkoslkdosdkoskdo

Python csv.DictReader: parse string?

I am downloading a CSV file directly from a URL using requests.

How can I parse the resulting string with csv.DictReader?

Right now I have this:

r = requests.get(url)
reader_list = csv.DictReader(r.text)
print reader_list.fieldnames
for row in reader_list:
    print row

But I just get ['r'] as the result of fieldnames, and then all kinds of weird things from print row.

From documentation of csv , the first argument to csv.reader or csv.DictReader is csvfile -

csvfile can be any object which supports the iterator protocol and returns a string each time its next() method is called — file objects and list objects are both suitable

In your case when you give the string as the direct input for the csv.DictReader() , the next() call on it only provides a single character, and hence that becomes the header, and then next() is continuously called to get each row.

Hence, you need to either provide a in-memory stream of the string (Using StringIO) or a list of lines (using splitlines)

You can use io.StringIO() and then use it in csv.DictReader . Example/Demo -

>>> import csv
>>> s = """a,b,c
... 1,2,3
... 4,5,6
... 7,8,9"""
>>> import io
>>> reader_list = csv.DictReader(io.StringIO(s))
>>> print reader_list.fieldnames
['a', 'b', 'c']
>>> for row in reader_list:
...     print row
{'a': '1', 'c': '3', 'b': '2'}
{'a': '4', 'c': '6', 'b': '5'}
{'a': '7', 'c': '9', 'b': '8'}

Or as indicated in the comments , you can split the lines before giving as input to csv.DictReader . Example/Demo -

>>> reader_list = csv.DictReader(s.splitlines())
>>> print reader_list.fieldnames
['a', 'b', 'c']
>>> for row in reader_list:
...     print row
{'a': '1', 'c': '3', 'b': '2'}
{'a': '4', 'c': '6', 'b': '5'}
{'a': '7', 'c': '9', 'b': '8'}
  • 49
Reply Report
      • 1
    • The problem with using splitlines() is, if the content contains line breaks within a column (using quotes), it will break the line anyway.
      • 1
    • As @augustomen has commented, you should explain that splitlines can break the record data line, since it can be inserted into a field by using quotes. If this is a problem, it should be stated. If the csv library can handle this, it should be also explained.

Trending Tags