用于CSV文件输出的Python中的键的值增加

时间:2018-05-21 18:29:04

标签: python python-3.x csv

这是我的输入CSV文件。

client_ip   listener_service    listener_port
127.0.0.1   LMNO    123
::1         PQAR    768
::1         PQAR    128
12.4.5.2.4          67

和输出我想要如下

client_ip   listener_service    listener_port
127.0.0.1   LMNO                  123
::1         PQAR                 768,128
12.4.5.2.4                         67


 with open('client.csv', 'r') as fin, open('client_out_file.csv', 'w',newline='') as ffout:
        reader = csv.reader(fin)
        writer = csv.writer(ffout)
        d = {} # Empty Dictionary
        for row in reader:
            nkey = row[0]+row[1] #Creating Key using combinations
            if nkey not in d:
                d[nkey] = row      #Assiging Value to the key
                writer.writerow(row)
            else:
                    #print(row[2])
                    #d[nkey]=d[nkey]+list(row[2])
                    #writer.writerow(row)

else 部分或更简单的解决方案中需要帮助,以便如果为键显示任何新值,它将被包含而不替换先前的值。我试图避免在列表中保存csv内容然后使用字典 - 这是额外的行。只是fyi-我有一个很大的csv文件。

2 个答案:

答案 0 :(得分:1)

您可以使用pandas库轻松完成此操作:

<强> read_csv

df = pd.read_csv('your_csv.csv')

    client_ip listener_service  listener_port
0   127.0.0.1             LMNO            123
1         ::1             PQAR            768
2         ::1             PQAR            128
3  12.4.5.2.4                              67

<强> astype(str)

df['listener_port'] = df.listener_port.astype(str)
带有 groupby apply

join

df = df.groupby(['client_ip', 'listener_service'])['listener_port'].apply(lambda x: ', '.join(x)).reset_index()

    client_ip listener_service listener_port
0  12.4.5.2.4                             67
1   127.0.0.1             LMNO           123
2         ::1             PQAR      768, 128

<强> to_csv

df.to_csv('out.csv', index=False)

最终输出:

enter image description here

答案 1 :(得分:0)

因为row [2]是str。您只需将str连接到现有密钥即可。

with open('client.csv', 'r') as fin, open('client_out_file.csv', 'w',newline='') as ffout:
    reader = csv.reader(fin)
    writer = csv.writer(ffout)
    d = {} # Empty Dictionary
    for row in reader:
        nkey = row[0]+row[1] #Creating Key using combinations
        if nkey not in d:
            d[nkey] = row      #Assiging Value to the key

        else:
                d[nkey]+=","+row[2]


    for name, values in d.iteritems():
        print values
        writer.writerow(values)

编辑1:对不起,你的问题是重复写作。因此,即使我们在dict中创建唯一键也很困难,我们正在将行写入csv文件。将writerrow移到循环的末尾。在for循环之后使用以下代码将dict写入csv文件...