只有第一个和第三个元素从python列表打印到csv文件

时间:2017-10-29 15:46:10

标签: python list loops csv

我正在尝试将列表写入csv文件。 我遇到了几个问题。

  1. writer = csv.writer(f)AttributeError:'list'对象没有属性'writer'
  2. 我使用这个link来解决它并且它起作用,并且只打印了第二个而没有写第一个和第三个。

    这是由@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)
    

    这个想法是用列表索引替换包含1的列表。这个问题已经解决了。当我使用上面的链接解决第一个问题时,代码运行但没有写入csv文件。 我试图将第一个问题的解决方案与@gumboy代码结合起来,这里是代码:

    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]
    

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

问题是你为for循环的每次迭代再次打开文件(只打开一次),然后覆盖它,因为你将'w'作为'mode'参数传递(如果你只想追加)你可以传递'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文件将如下所示(第一列包含客户,第二列包含产品):

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