【问题标题】:writing a dictionary with one key and two values to a csv file将具有一个键和两个值的字典写入 csv 文件
【发布时间】:2019-07-02 02:26:07
【问题描述】:

我有一本有一个键和两个值的字典。我想将字典写入 csv 文件,并根据其中一个值进行排序。我还希望每个值在 csv 文件中都有自己的列。 我好像做不到。

sorted_combined = sorted(combined.items(), key = lambda kv: kv[1][1])
with open('output.csv', 'wb') as output:
   writer = csv.writer(output)
   writer.writerow(["Subject", "Sij", "gij"])
for key, value in sorted_combined.iteritems():
   writer.writerow(k, sorted_combined[k])

我知道有些人说要试试 writer.writerow([k] + sorted_combined) 要么 writer.writerow(key, *value)

没有一个工作。我得到的错误消息是:无法连接元组。

我期望得到的是:

 Subject     Sij      gij
 sub001_01   6578     18
 sub992_03   3820     5

*****编辑***** 这就是我的 sorted_combined 的样子。但是,例如,您在最后看到的 (1,6) 不再是元组,而是字符串。命名字典键时,每个元组都被转换为字符串。

[('network6_QNS_0045_01_(1, 6)', (0.0, 0.0)), ('network6_QNS_0045_01_(1, 4)', (0.0, 0.0)), ('network6_QNS_0045_01_(0, 6)', (0.0 , 0.0)), ('network6_QNS_0045_01_(2, 5)', (0.0, 0.0)), ('network6_QNS_0045_01_(1, 7)', (0.0, 0.0)), ('network6_QNS_0045_01_(1, 5)', ( 0.0, 0.0)), ('network6_QNS_0045_01_(1, 3)', (0.0, 0.0)), ('network6_QNS_0045_01_(5, 6)', (0.0, 0.0)), ('network6_QNS_0045_01_(3, 5)', (0.0, 0.0)), ('network6_QNS_0045_01_(2, 6)', (743466.0, 18.387329999999999)), ('network6_QNS_0045_01_(5, 7)', (142774.0, 18.76964999_9999999)'4999_9999999)), (0_1 (232822.0,20.1606400000001)),('Network6_Qns_0045_01_(3,6)'(780163.0,24.74813999999999999999999)),('Network6_Qns_0045_01_(2,3)',(199652.0,26.6358600000000000001),('Network6_Qns_0045_01_(4,7) '(2248433.0,27.27872999999999999999999)),('Network6_Qns_0045_01_(3,4)'(922289.0,27.979320000000001)),('Network6_Qns_0045_01_(1,2)',(396823.0,29.924759999999999999999999999999999),('network6_qns_0045_01_(4,6 )', (2897317.0, 30.266200000000001)), ('ne Twork6_qns_0045_01_(0,4)'(520923.0,31.0405699999999999999)),('Network6_Qns_0045_01_(4,5)'(6358.0,32.68)),('Network6_Qns_0045_01_(2,4)',(3622715.0,35.321170000000002),( 'Network6_Qns_0045_01_(2,7)'(364815.0,37.499250000000004),('network6_qns_0045_01_(0,1)'(145240.0,38.8780599999999998)),('network6_qns_0045_01_(0,7)',(224456.0,46.5182)), ('network6_qns_0045_01_(0,3)'(1692.0,56.8495000000000003)),('network6_qns_0045_01_(6,7)'(280955.0,57.61619000000000003),('network6_qns_0045_01_(3,7)',(2012.0,71.302719999999994)) , ('network6_QNS_0045_01_(0, 2)', (1660.0, 84.085009999999997))]

【问题讨论】:

    标签: python pandas csv sorting dictionary


    【解决方案1】:

    我编辑了我的答案,你没有使用字典。你有一个元组列表。

    import csv 
    with open('output.csv', 'wb') as f:
        writer = csv.writer(f)
        writer.writerow(['Subject', 'Sij', 'gij'])
        for row in sorted_combined:
            l = [row[0]]
            l.append(row[0][1])
            l.append(row[1][1])
            writer.writerow(l)
    

    就像您在最初的尝试中所做的那样,csv.writer 是要走的路

    【讨论】:

    • 我不断收到此错误:“TypeError: list indices must be integers, not tuple”在这行代码:f.write(', '.join([str(x) for x in sorted_combined[key]]))
    • 你能打印出你在 sorted_combined 字典中的值是什么样子的吗
    • 我刚刚编辑了我的答案。你没有使用字典,所以你有位置索引而不是键
    • 要使其标签分隔,只需将逗号更改为 \t,正如 Batuhan 建议的那样
    • 啊,是的,csv.writer 是避免这种情况的方法,编辑了我的答案
    【解决方案2】:

    您可以生成一个列表,将其展平,然后使用CSV 简单地编写它。不过,我不知道是否有更短的方法。

    import csv
    
    my_dict = {"sub001_01": [6578,18], "sub992_03": [3820,5]}
    
    with open('my_file.csv', 'w') as f:
        w=csv.writer(f)
        w.writerow(["Subject", "Sij", "gij"])
        for i in list(my_dict.items()):
            #We first make a list like: ['test', 1, 2, 3]
            list1=[a for a in i]
            list_final=[]
            list_final.append(i[0])
            for c in list1[1]:
                list_final.append(c)
            #We use writerow() to write our new list
            w.writerow(list_final)
    

    输出:

    Subject,Sij,gij
    sub001_01,6578,18
    sub992_03,3820,5
    

    要使用 '\t' 而不是逗号,只需指定分隔符

    w=csv.writer(f,delimiter="\t")
    

    这将产生:

    Subject Sij gij
    sub001_01   6578    18
    sub992_03   3820    5
    

    P.S:这是针对 Python 3.X 的

    编辑:忘了提到这是一个可以处理超过 2 个值的通用循环。您也可以将它与其他字典(包含多个值的列表)一起使用。

    【讨论】:

    • 谢谢,我只是想知道如何以上面显示的格式获取它。在表中,每个值都有自己的列,而不是用逗号分隔。
    • 非常简单 :) 只需将 delimiter="\t" 添加到 csv.writer() || w=csv.writer(f,delimiter="\t")
    猜你喜欢
    • 2012-01-30
    • 2017-12-12
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多