1

我正在尝试使用内置的 python csv 阅读器解析 csv 文件,如下所示:

sms_prices_list_url = "http://www.twilio.com/resources/rates/international-sms-rates.csv"
sms_prices_list = requests.get(sms_prices_list_url)
reader = csv.reader(sms_prices_list.text)
for row in reader:
    print row

但是,当我这样做时,几乎所有内容都是按字符打印的,而不是按字典项或列项打印,例如:

['C']
['o']
['u']
['n']
['t']
['r']
['y']
['', '']
[' ']
['N']
['a']
['m']
['e']
['', '']
[' ']
['R']
['a']
['t']
['e']
[]
['', '']
['UNITED STATES Inbound SMS - Other']
['', '']
['0']

如何将这些条目分成字典列表?

4

4 回答 4

7

csv.reader期望它的参数一次产生一行文本。您正在迭代一个字符串,它一次产生一个字符。将其更改为:

reader = csv.reader(sms_prices_list.iter_lines())

请注意,这不会给您一个字典列表,而是一个可迭代的列表,因为这csv.reader就是要给您的。此外,如果输入是 UTF-8 以外的 Unicode 编码,它可能会中断;有关这方面的一些提示,请参阅文档。

于 2013-06-09T08:00:03.560 回答
3

由于您将原始文本传递给它,因此它在迭代每个字符时会对其进行拆分。用来StringIO解决这个问题:

import StringIO
import csv
import requests

r = requests.get('http://www.twilio.com/resources/rates/international-sms-rates.csv')
reader = csv.DictReader(StringIO.StringIO(r.text))
row = next(reader) # get the next row
print(row)

以上将为您提供:

{'Country': '', ' Rate': '0.010', ' Name': 'UNITED STATES Inbound SMS - Other'}

您现在可以遍历它:

for row in reader:
    print(row)
    # do whatever with row

最后的想法,如果你需要一个字典列表,你不需要循环:

reader = csv.DictReader(StringIO.StringIO(r.text))
list_of_dicts = list(reader)
于 2013-06-09T08:06:24.807 回答
2

您可以使用 StringIO 将字符串传递给 csv.reader,如本答案中所述。

于 2013-06-09T08:02:07.803 回答
2

为了提高效率并解决您的问题,请使用urllib.urlopen

import urllib, csv
sms_prices_list_url = "http://www.twilio.com/resources/rates/international-sms-rates.csv"
sms_prices_list = urllib.urlopen(sms_prices_list_url)
reader = csv.reader(sms_prices_list)
for row in reader:
    print row
于 2013-06-09T08:04:18.613 回答