• ベストアンサー

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 とこのように書きました。もう行き詰ってきたので、質問させてもらいました。誰かご教授願えますか?

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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]) なんで一行毎に辞書オブジェクトを作ってるのかわからん。 リストのままで問題ないと思うんだけど

yxia001
質問者

お礼

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

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

yxia001
質問者

補足

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