序言
鉴于自己是傻逼加菜鸡程序员,为了完成完成创新实践的内容,完成对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 = {} dict_node_1 = {} while line_num < total_lines: values = lines[line_num].split(",") dict_node_0[values[0]] = values[1] dict_node_1[values[1]] = values[0] 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=‘’