Ответ 1
так что происходит, ну, вызов help
может пролить некоторый свет.
>>> help(csv.reader)
reader(...)
csv_reader = reader(iterable [, dialect='excel']
[optional keyword args])
for row in csv_reader:
process(row)
The "iterable" argument can be any object that returns a line
of input for each iteration, such as a file object or a list. The
optional "dialect" parameter is discussed below. The function
also accepts optional keyword arguments which override settings
provided by the dialect.
поэтому представляется, что csv.reader
ожидает итератора какого-либо типа, который вернет строку, но мы передаем строку, которая итерации на основе char, поэтому его синтаксический анализ по символу, один из способов исправить это было бы создание временного файла, но нам не нужно, нам просто нужно передать любой итерируемый объект.
обратите внимание на следующее, которое просто разбивает строку на список строк, прежде чем ее подают в считыватель.
import csv
import requests
r = requests.get('http://vote.wa.gov/results/current/export/MediaResults.txt')
data = r.text
reader = csv.reader(data.splitlines(), delimiter='\t')
for row in reader:
print row
похоже, что это работает.
Я также рекомендую использовать csv.DictReader
его весьма полезный.
>>> reader = csv.DictReader(data.splitlines(), delimiter='\t')
>>> for row in reader:
... print row
{'Votes': '417141', 'BallotName': 'Michael Baumgartner', 'RaceID': '2', 'RaceName': 'U.S. Senator', 'PartyName': '(Prefers Republican Party)', 'TotalBallotsCastByRace': '1387059', 'RaceJurisdictionTypeName': 'Federal', 'BallotID': '23036'}
{'Votes': '15005', 'BallotName': 'Will Baker', 'RaceID': '2', 'RaceName': 'U.S. Senator', 'PartyName': '(Prefers Reform Party)', 'TotalBallotsCastByRace': '1387059', 'RaceJurisdictionTypeName': 'Federal', 'BallotID': '27435'}
в основном он возвращает словарь для каждой строки, используя заголовок в качестве ключа, таким образом нам не нужно отслеживать порядок, но вместо этого просто немного упрощается для нас, т.е. row['Votes']
кажется более читаемым затем row[4]
...