2017-10-29 7 views
2

csvファイルにリストを書き込もうとしています。 私はいくつかの問題に直面しています。 (F)はAttributeError = csv.writerpythonリストからcsvファイルに印刷された最初と3番目の要素のみ

  1. 作家は:「リスト」オブジェクトが属性「作家

を持っていない私はそれを解決するために、このlinkを使用し、それが働いた、とだけなしのための第二の印刷しました最初と3番目を書く。

これはアイデアはリストインデックスに1を含むリストを交換することである@gumboy

csv = [['1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], ['2', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0'], ['3', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0']] 

csvdict = {words[0]:words[1:] for words in csv} 
for x in csvdict.keys(): # iterate over the keys '1', '2', .... 
    products = [index+1 for index,v in enumerate(csvdict[x]) if v == '1' ] # create list of purchases where the '1's are indexed 

    print ("costummer", x, "buy", products) 

によって書かれたコードです。この問題は既に解決されています。上記のリンクを使用して最初の問題を解決すると、コードは実行されましたが、csvファイルに書き込まれませんでした。 私は@gumboyコードで最初の問題の解決策を組み合わせることを試み、ここではコードである:私は上記のように、コードが動作のみ印刷せずに第一および第三の要素の第2のプリントされ

csvdict = {words[0]:words[1:] for words in csv} 
for x in csvdict.keys(): # iterate over the keys '1', '2', .... 
    products = [index+1 for index,v in enumerate(csvdict[x]) if v == '1' ] # create list of purchases where the '1's are indexed 

    #print (products) 
    f = open("H.csv", 'w') 
    hasil = ("costummer", x, "buy", products) 
    hasilstr = (','.join([str(x) for x in hasil])) 
    print (hasilstr) 
    f.write(hasilstr) 

csvファイルに書かれている対印刷機能: 印刷:

costummer,1,buy,[12, 22] 
costummer,2,buy,[8, 12, 38, 46] 
costummer,3,buy,[4, 34, 43] 

CSFファイル:

costummer,2,buy,[8, 12, 38, 46] 

答えて

1

何がf = open('H.csv','w')でやっていることは、それが書き込みされていることですあなたのデータを上書きすることもできます。あなたがする必要があるのは、使用f =open('H.csv', 'a+')です。これは毎回ファイルに新しい文字列を追加します。データをソートするlink は、私は、コンソールに印刷されたものをファイルに書き込むことができました。このコードで

for x in sorted(csvdict.keys()): 

を使用しています。

csvfile = [['1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], ['2', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0'], ['3', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0']] 
csvdict = {words[0]:words[1:] for words in csvfile} 
for x in sorted(csvdict.keys()): # iterate over the keys '1', '2', .... 
    products = [index+1 for index,v in enumerate(csvdict[x]) if v == '1' ] # create list of purchases where the '1's are indexed 

    #print (products) 
    f = open("H.csv", 'a+') 
    hasil = ("costummer", x, "buy", products) 
    hasilstr = ("costummer, %s,buy,"+','.join([str(i) for i in products])) %(x) 
    print (hasilstr) 
    f.write(hasilstr +"\n") 
+0

興味深いことに、3番目の要素ではなく2番目の要素が印刷されていることがわかりました。リストをstrに変換することで、正しい移動先ですか?他のものはなぜ最後の要素(3番目の要素)を出力しないのでしょうか? – Tanabata

+0

あなたの希望するCSV出力は何ですか? – Gumboy

+0

CMIIW、彼らは正しいものを書くだろうか?私はちょうど私が上でやっていることがループロジックを乱用していないことを明確にしたいということです。 printとwrite hasilstrなので、彼らはそれが正しいものを書くべきですか? 1、購入、[12,22]、 コスマーマー、2、購入、[8,12,38,46]、 コスマーマー、3、購入、[4,34,43] ]、彼らはcostumer 1と2しか印刷しませんでした。 – Tanabata

1

問題は、forループの各反復(一度だけそれを開き)、その後、あなただけ追加したい場合は、(「モード」引数として'w'を渡すので、それを上書きするために再度ファイルを開くことですあなたは 'a'を渡すことができます)。

csvモジュールをインポートし、withステートメントでファイルを開き、ライターwriter = csv.writer(csv_file)を作成し、ヘッダーを書き、次にforループに書き込みます。

:(。 csvはモジュールの名前であるため、また、 csvリストの名前を変更)

import csv 


lst = [...] # Your csv list. 
csvdict = {words[0]:words[1:] for words in lst} 

with open('temp.csv', 'w', newline='') as csv_file: 
    writer = csv.writer(csv_file, delimiter=';') 
    writer.writerow(('costumer', 'buy')) # Write the header. 
    for costumer in csvdict: 
     products = [index for index, v in enumerate(csvdict[costumer], 1) if v == '1'] 
     writer.writerow((costumer, products)) 

結果のCSVファイルは、この(最初の列がcostumersの第二の製品が含まれている)のようになります。

costumer;buy 
3;[4, 34, 43] 
2;[8, 12, 38, 46] 
1;[12, 22] 
+1

ありがとうございました。私はリストを削除しようとしましたが、これまでのところあなたのコードは次のように使用されています:products1 = "、" .x(製品のxはstr(x))writer.writerow((costumer、products1)))リストを削除してもブレーキをはずしましたが、それでも削除方法はわかっています – Tanabata

+1

csvの作者はカンマが区切り文字として使われていて、リストもカンマを使って項目を区切っているため引用符を追加する必要がありました。これを防ぐには、セミコロンのような別の区切り文字を渡します。私は例を編集しました。 – skrx

+1

muchas gracias sir。 – Tanabata

関連する問題