所以发生了什么,好吧,一个电话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]
......