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その引数は、一度に 1 行のテキストを生成することを期待しています。文字列を繰り返し処理しているため、一度に 1 文字が生成されます。次のように変更します。

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 に答える