- ベストアンサー
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 とこのように書きました。もう行き詰ってきたので、質問させてもらいました。誰かご教授願えますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>実際に出てくる結果は測定時間しか出てこないんです。 とありますけど、質問に貼られているスクリプトはバグがあって動かないんじゃないですか? 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]) なんで一行毎に辞書オブジェクトを作ってるのかわからん。 リストのままで問題ないと思うんだけど
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
タイトルもカテゴリも間違ってるな. それのどこが C と関係する? ついでにいうけど, それをおいても質問の表現としてなっていません. 「なかなか出てくれない」でどのような状況なのか正確に理解できる人がいると思いますか? せめて ・あなたの予想した結果 (こうなると思った) ・実際に得られた結果 (こんなことになった) くらいは書いてください. 例えば, 「なかなか出てくれない」だと「単に時間がかかっているだけ」とも解釈できるんだけど, それでいいの?
補足
すいません。まちがえました、Cではないです。 ほしい結果としては 日付、小計 日付、小計 ; という風にでてほしいんですが、 実際に出てくる結果は測定時間しか出てこないんです。
お礼
有難う御座います。 ちゃんと動きました。 確かに、なんで1行ごとに辞書オブジェクト作っていたのか.... もっと注意してチェックしたいと思います。