这是我的输入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文件。
答案 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)
最终输出:
答案 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文件...