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

Posted

技术标签:

【中文标题】只有第一个和第三个元素从 python 列表打印到 csv 文件【英文标题】:Only the first and third element printed from python list to csv file 【发布时间】:2018-04-10 15:47:46 【问题描述】:

我正在尝试将列表写入 csv 文件。 我面临几个问题。

    writer = csv.writer(f) AttributeError: 'list' object has no attribute 'writer'

我用这个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]

【问题讨论】:

【参考方案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")

【讨论】:

是的,这很有趣,我没有注意到是因为它们打印的是第二个元素而不是第三个元素。那么通过将列表转换为 str 是正确的举措吗?另一件事是为什么它不会打印最后一个(第三个)元素? 你想要的 csv 输出是什么? CMIIW,他们会写他们打印的内容吗?我的意思是我只是想澄清一下我在上面做什么并没有滥用循环逻辑。既然打印和写hasilstr,他们应该写它打印的内容吗?在这种情况下,他们打印:costummer,1,buy,[12, 22], costummer,2,buy,[8, 12, 38, 46], costummer,3,buy,[4, 34, 43],但他们仅打印客户 1 和 2。 这对您有帮助吗? 我的电脑一定有问题,因为我复制了 100% 的代码,它会打印 3 个客户,但仍然只在 csv 中打印 2 个客户,哈哈。【参考方案2】:

问题是您在 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]

【讨论】:

谢谢您,先生,我只是想知道我们可以删除“”吗?我尝试删除已制动的列表和“”到目前为止,我使用了您的代码,例如 = products1 = ",".join(str(x) for x in products) writer.writerow((costumer, products1)) 并删除该列表已停止但仍然知道如何删除“” csv 编写器必须添加引号,因为逗号用作分隔符,并且列表也使用逗号分隔项目。您可以通过传递不同的分隔符(如分号)来防止这种情况。我已经编辑了示例。 非常感谢先生。 不客气。此外,将数据存储在 json 文件中似乎是更好的选择。 谢谢先生,下次我会尝试用json文件代替。

以上是关于只有第一个和第三个元素从 python 列表打印到 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

Python列表常用操作

python:向列表中添加10个随机整数,找出其中第2大的元素

python学习DAY3(列表)

python插入排序算法总结

基本排序之插入排序

如何拆分每个第N个元素的Python列表