1

ユーザーごとに、彼が参加したイベントのリストがあります。例 bob : [event1,event2,...]

csvファイルに書きたいです。ディクショナリを作成しました (キー - ユーザー & 値 - イベントのリスト) csv で記述しました。以下はサンプル出力です

username, frnds
"abc"     ['event1','event2']

ユーザー名は最初の列で、frnds は 2 番目の列です

これはコードです

writer = csv.writer(open('eventlist.csv', 'ab'))
for key, value in evnt_list.items():
    writer.writerow([key, value])

csv を読んでいるときに、リストを直接取得していません。しかし、私は次の方法でそれを取得しています

['e','v','e','n','t','1','','...]

また、リストをcsvに直接書き込もうとしましたが、読み取り中に同じ出力が得られます。

私が欲しいのは、行の列を読み取るときにすべてのイベントのリストを取得できるように、単一のセルに複数の値があることです。

e.g
colA  colB
user1,event1,event2,...

難しくはないと思いますが、どういうわけか私はそれを理解していません。

###読む

私は次の助けを借りてそれを読んでいます

codereader = csv.reader(open("eventlist.csv")) 
reader.next() 
for row in reader: 
    tmp=row[1] 
    print tmp # it is printing the whole list but 
        print tmp[0] #the output is [ 
        print tmp[1] #output is 'e' it should have been 'event1'
        print tmp[2] #output is 'v' it should have been 'event2'
4

2 に答える 2

2

値を単一の文字列にフォーマットする必要があります。

with open('eventlist.csv', 'ab') as f:
    writer = csv.writer(f, delimiter=' ')
    for key, value in evnt_list.items():
        writer.writerow([key, ','.join(value)])

としてエクスポートします

key1 val11,val12,val13
key2 val21,val22,val23

READING:ここで、Python リストをフォーマットされた文字列に変換したことを覚えておく必要があります。したがって、標準の csv ツールを使用して読み取ることはできません。

with open("eventlist.csv") as f:
    csvr = csv.reader(f, delimiter=' ') 
    csvr.next() 
    for rec in csvr: 
        key, values_txt = rec 
        values = values_txt.split(',')
        print key, values

待望の作品。

于 2013-02-14T12:35:21.523 に答える
0

evnt_listあなたは、キーが文字列で、値が文字列のリストである辞書であると言っているようです。その場合、質問で指定したCSV書き込みコードは、Pythonリストの文字列表現を2番目の列に書き込みます。CSVから何かを読み込むと、それは単なる文字列になるため、リストの文字列表現が再び得られます。たとえば、を含むセルがある場合、最初の文字(位置0)が、2番目の文字が、3番目の文字がなど"['event1', 'event2']"の文字列を読み取ることになります(私はあなたが正しいとは思わない;私はそれを考える本当に、ではありません。)['etmp[1]'e

Pythonオブジェクト、この場合は文字列のリストを再構築したいようです。これを行うには、次を使用しますast.literal_eval

import ast

cell_string_value = "['event1', 'event2']"
cell_object = ast.literal_eval(cell_string_value)

ちなみに、ast.literal_evalただの代わりに使う理由evalは安全です。eval任意のPython式を許可するため、セキュリティ上のリスクがあります。

また、リストをリストとして戻したい場合、CSVの目的は何ですか?人々はそれを(Excelか何かで)読んでいますか?そうでない場合は、またはevnt_listを使用してオブジェクトを保存するだけで、CSVをまったく気にしないでください。picklejson

編集:もっと注意深く読むべきだった。からのデータはCSVevnt_list追加されており、簡単に追加することpickleもできません。jsonしたがって、CSVはデータを蓄積するための合理的で軽量な方法だと思います。本格的なデータベースの方が良いかもしれませんが、それはそれほど軽量ではありません。

于 2013-02-14T15:11:53.007 に答える