こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

csvファイルでpythonを扱いたいんですが

以下のようなcsvファイルを使って
shop,ymd,gend,age,area,amt
20,2008-05-01,3,5,014,128
22,2008-05-01,2,4,015,350
:
二列目の日別、つまりymd別に最後列のamdの小計を出したいんですが、なかなか出てくれません。以下のようなプログラムを組んだんですが

#!/usr/bin/env python
import csv
def readcsv(filename):
 L = [line[:-1] for line in file(filename).readlines()]
 return map((lambda s: s.split(',')),L)
csvlist = readcsv('/data/testdata/journal/j080240.csv')
i=0
for line in csvlist[1:]:
buydict = dict(zip(csvlist[0],line))
if buydict.itervalues('ymd'):
i+=int(buydict['amt'])
else:
print '%s,%d'% buydict['ymd'],i
i=0
とこのように書きました。もう行き詰ってきたので、質問させてもらいました。誰かご教授願えますか?

投稿日時 - 2009-10-28 10:09:00

QNo.5402886

困ってます

質問者が選んだベストアンサー

>実際に出てくる結果は測定時間しか出てこないんです。
とありますけど、質問に貼られているスクリプトはバグがあって動かないんじゃないですか?

if buydict.itervalues('ymd'):

この buydict が持っているメソッドに itervalues() というのはありますが
それは引数を取らないはずです。
また、スクリプトの頭で
import csv
してますけど、スクリプトでこのモジュールにあるものを何も使ってませんよね。

そもそも map だの zip だの lambda を使ってる人が最初に挙げたような
バグを放置しているとか信じられないのですが。

#!/usr/bin/env python
#import csv

def readcsv(filename):
____L = [line[:-1] for line in file(filename).readlines()]
____return map((lambda s: s.split(',')), L)

csvlist = readcsv('./moge.csv')
totalamt = {}

for line in csvlist[1:]:
____buydict = dict(zip(csvlist[0], line))
____if 'ymd' in buydict.keys():
________if not buydict['ymd'] in totalamt:
____________totalamt[buydict['ymd']] = 0
________totalamt[buydict['ymd']] += int(buydict['amt'])

for k in sorted(totalamt.keys()):
____print '%s,%d' % (k, totalamt[k])

なんで一行毎に辞書オブジェクトを作ってるのかわからん。
リストのままで問題ないと思うんだけど

投稿日時 - 2009-10-28 21:55:24

お礼

有難う御座います。
ちゃんと動きました。
確かに、なんで1行ごとに辞書オブジェクト作っていたのか....

もっと注意してチェックしたいと思います。

投稿日時 - 2009-10-29 10:40:02

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

タイトルもカテゴリも間違ってるな.
それのどこが C と関係する?
ついでにいうけど, それをおいても質問の表現としてなっていません. 「なかなか出てくれない」でどのような状況なのか正確に理解できる人がいると思いますか? せめて
・あなたの予想した結果 (こうなると思った)
・実際に得られた結果 (こんなことになった)
くらいは書いてください.
例えば, 「なかなか出てくれない」だと「単に時間がかかっているだけ」とも解釈できるんだけど, それでいいの?

投稿日時 - 2009-10-28 11:20:26

補足

すいません。まちがえました、Cではないです。
ほしい結果としては
日付、小計
日付、小計
  ;
という風にでてほしいんですが、
実際に出てくる結果は測定時間しか出てこないんです。

投稿日時 - 2009-10-28 11:38:38

あなたにオススメの質問