序言

鉴于自己是傻逼加菜鸡程序员,为了完成完成创新实践的内容,完成对CSV文件的批量替换。想了一个特别傻逼的方法,以空间换时间的方式,进行文件的处理。

准备工作

准备一个空文件夹,文件夹中有两个文件,分别为node.csv和 relation.csv。格式都是UTF-8的格式。大致内容如下

1
2
3
4
5
6
7
8
9
# 下面的是Node
id,name
0,f403b007a8214465f202f2d4fae5c4b7
1,9bba3a82f89eef8fb9193c1ab4156b58

# 下面的是relation
ds,server,id_src,id_dst,type,value
2019-02-01,757b505cfd34c64c85ca5b5690ee5293,f403b007a8214465f202f2d4fae5c4b7,9bba3a82f89eef8fb9193c1ab4156b58,交易,1
2019-02-01,757b505cfd34c64c85ca5b5690ee5293,8d3e52721b4dad90090bc67500505e1a,c72d1f19c122abbc787557dd04c84a64,交易,1

目的是将relation中的id_src 和 id_dst都用Node中一一对应的数字进行更换。

具体步骤

导入工具包

1
2
3
4
# 导入工具包
import json
import csv
import pandas as pd

导入节点

再导入节点的过程中,不得不承认自己真是个傻逼,很多Python中的内容都不知道。其中确定了通过Python字典中的key可以很容易找到values,但是很难通过values找到key,所以我有点傻逼了。有方法,但我不懂。

索性直接建立两个字典。其中一个的key便是id,Values便是节点的名字。

另外一个与之相反。key 是 节点名字,values是节点id

1
2
3
4
5
6
7
8
9
10
11
12
13
# 导入节点进入字典
node = './node.csv'
lines = open(node, "r", encoding='utf-8').readlines()
lines = [line.strip() for line in lines]
line_num = 1
total_lines = len(lines)
dict_node_0 = {} # 以id为key,name 等于 vulues
dict_node_1 = {} # 以name为key,id 等于 vulues
while line_num < total_lines: # 创建两个字典
values = lines[line_num].split(",")
dict_node_0[values[0]] = values[1] # 以 id 为索引
dict_node_1[values[1]] = values[0] # 以 name 为索引
line_num += 1

这样子就创建了两个字典,为下面的替换做准备

尝试替换

很简单一步,读取每一行的过程,如果id_src 或者id_dst 等名字在以id以索引的字典中,那么从name为索引的字典中取出id进行替换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
relation = './relation.csv'
relation_num = './relation_num.csv'
lines = open(relation, "r", encoding='utf-8').readlines()
lines = [line.strip() for line in lines]
line_num = 1
total_lines = len(lines)
parsed_datas = [] # 存储替换后的列表
while line_num < total_lines:
values = lines[line_num].split(",")
if values[2] in dict_node_0.values(): # 提取第一列的数剧 不重复添加
values[2] = dict_node_1[values[2]]
if values[3] in dict_node_0.values(): # 提取第二列的数据 不重复添加
values[3] = dict_node_1[values[3]]
parsed_datas.append(values)
line_num += 1 #递增

生成CSV文件

使用csv文件库进行生成,就比较容易了

1
2
3
4
5
6
7
headers = ['ds','server','id_src','id_dst','type','value']

# 编码错误用utf-8,空行用newline=''
with open(relation_num,'w',newline='',encoding='utf-8') as f:
f_csv = csv.writer(f)
f_csv.writerow(headers)
f_csv.writerows(parsed_datas)

关键是open在不同的函数上都不一样,比较麻烦。如果有数据导出后有空行,加上个newline=‘’