何が起こっているのか、まあ、への呼び出し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
ますが、文字ベースで反復する文字列を渡しているため、文字ごとに解析しています。これを修正する 1 つの方法は、一時ファイルを生成することです。反復可能なオブジェクトを渡す必要があるだけです。
以下に注意してください。これは、リーダーにフィードする前に、文字列を行のリストに単純に分割します。
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]
ます...