python - 使用 csv.reader 的制表符分隔文件未在我期望的位置分隔

标签 python csv python-requests

我正在尝试使用 Python 循环遍历以制表符分隔的选举结果文件。以下代码不起作用,但是当我使用具有相同结果的本地文件(注释掉的行)时,它确实可以按预期工作。

我唯一能想到的是一些标题或内容类型我需要传递 url,但我无法弄清楚。

为什么会这样?

import csv
import requests

r = requests.get('http://vote.wa.gov/results/current/export/MediaResults.txt') 
data = r.text
#data = open('data/MediaResults.txt', 'r')
reader = csv.reader(data, delimiter='\t')
for row in reader:
    print row

结果:

...
['', '']
['', '']
['2']
['3']
['1']
['1']
['8']
['', '']
['D']
['a']
['v']
['i']
['d']
[' ']
['F']
['r']
['a']
['z']
['i']
['e']
['', '']
...

最佳答案

所以发生了什么,好吧,调用 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 基础上迭代的字符串,这就是它逐个字符解析的原因,解决这个问题的一种方法是生成一个临时文件,但我们不需要,我们只需要传递 any 可迭代对象。

请注意以下内容,它只是将字符串拆分为行列表,然后再将其提供给阅读器。

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]...

更具可读性

关于python - 使用 csv.reader 的制表符分隔文件未在我期望的位置分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12136850/

相关文章:

csv - 如何在Odoo的csv导入中覆盖 "ir.sequence"字段?

python - 代码重写 - MemoryError

python - 如何在 Flask 中通过 POST 请求发送图像

indexing - 使用 python 请求模块进行 Elasticsearch 批量/批量索引

Python 3 struct.pack() : char format requires a bytes object of length 1

python - 比较两个变量时的 Ansible

从字符串中提取可能日期的 Python 模块?

python - Django ; AWS Elastic Beanstalk 错误 : Your WSGIPath refers to a file that does not exist

python - 在 Python 中重新格式化制表符分隔的数据

python - PyQt5 加载微调器在发布请求时停止