open读文件open()中"a"为追加写,w为删除原有内容从头写,r为只读,r+和w+都为读写(从头) file=open(path,"a",newline="")
.
csv.reader和csv.writer读写文件,np数组用scv.writer.writerow()和writerows
可以直接写入csv中.
if x in 列表y : return[i for i in range(len(y)) if y(i)==x] else 列表.append()
这里用的是[],用()的话返回的是生成器.
"""---------*- coding: utf-8 -*------------------
File Name: ex0
Author: kingsCat
date: 2022/3/2 14:04
Description:
----------------------------------------------"""
import tqdm
from sklearn import datasets
import numpy as np
import csv
import time
# 将相应的非数字类型转换为数字标识即符号型数据转化为数值型数据
def find_index(x, y):
return [i for i in range(len(y)) if y[i] == x]
# 定义将源文件行中3种协议类型转换成数字标识的函数
def handleProtocol(input):
protocol_list = ['tcp', 'udp', 'icmp']
if input[1] in protocol_list:
return find_index(input[1], protocol_list)[0]
# 定义将源文件行中70种网络服务类型转换成数字标识的函数
def handleService(input):
service_list = ['aol', 'auth', 'bgp', 'courier', 'csnet_ns', 'ctf', 'daytime', 'discard', 'domain', 'domain_u',
'echo', 'eco_i', 'ecr_i', 'efs', 'exec', 'finger', 'ftp', 'ftp_data', 'gopher', 'harvest',
'hostnames',
'http', 'http_2784', 'http_443', 'http_8001', 'imap4', 'IRC', 'iso_tsap', 'klogin', 'kshell',
'ldap',
'link', 'login', 'mtp', 'name', 'netbios_dgm', 'netbios_ns', 'netbios_ssn', 'netstat', 'nnsp',
'nntp',
'ntp_u', 'other', 'pm_dump', 'pop_2', 'pop_3', 'printer', 'private', 'red_i', 'remote_job', 'rje',
'shell',
'smtp', 'sql_net', 'ssh', 'sunrpc', 'supdup', 'systat', 'telnet', 'tftp_u', 'tim_i', 'time',
'urh_i', 'urp_i',
'uucp', 'uucp_path', 'vmnet', 'whois', 'X11', 'Z39_50']
if input[2] in service_list:
return find_index(input[2], service_list)[0]
# 定义将源文件行中11种网络连接状态转换成数字标识的函数
def handleFlag(input):
flag_list = ['OTH', 'REJ', 'RSTO', 'RSTOS0', 'RSTR', 'S0', 'S1', 'S2', 'S3', 'SF', 'SH']
if input[3] in flag_list:
return find_index(input[3], flag_list)[0]
# 定义将源文件行中攻击类型转换成数字标识的函数(训练集中共出现了22个攻击类型,而剩下的17种只在测试集中出现)
def handleLabel(input):
# label_list=['normal.', 'buffer_overflow.', 'loadmodule.', 'perl.', 'neptune.', 'smurf.',
# 'guess_passwd.', 'pod.', 'teardrop.', 'portsweep.', 'ipsweep.', 'land.', 'ftp_write.',
# 'back.', 'imap.', 'satan.', 'phf.', 'nmap.', 'multihop.', 'warezmaster.', 'warezclient.',
# 'spy.', 'rootkit.']
global label_list # 在函数内部使用全局变量并修改它
if input[41] in label_list:
return find_index(input[41], label_list)[0]
else:
label_list.append(input[41])
return find_index(input[41], label_list)[0]
if __name__ == "__main__":
# 加载数据集,并且把data和target合并起来
kdd = datasets.fetch_kddcup99(data_home="./kdd-set", download_if_missing=False, random_state=1)
X, Y = kdd.data, kdd.target
Y = np.expand_dims(Y, 1) # 在1上扩容,就相当于进入一个[]后再在每个元素中添加[]
Z = np.append(X, Y, axis=1) # 在列上合并.就是指把每一列一溜溜的拍起来.||和|||合并就成就了|||||
print(Z.shape)
source_path = "./kdd-set"
handled_path = "./handled.csv"
# 打开文件
data_file = open(handled_path, "w", newline="") # 若没有这个文件,直接就能创建
# csv写器
csv_writer = csv.writer(data_file)
label_list = []
for i in tqdm.trange(Z.shape[0]):
buffer = Z[i]
buffer[1] = handleProtocol(buffer) # 将源文件行中3种协议类型转换成数字标识
buffer[2] = handleService(buffer) # 将源文件行中70种网络服务类型转换成数字标识
buffer[3] = handleFlag(buffer) # 将源文件行中11种网络连接状态转换成数字标识
buffer[41] = handleLabel(buffer) # 将源文件行中23种攻击类型转换成数字标识
csv_writer.writerow(buffer)
# 输出每行数据中所修改后的状态
data_file.close()
def 验证csv读写方式():
path="./handled.csv"
# open()中"a"为追加写,w为删除原有内容从头写,r为只读,r+和w+都为读写(从头)
file=open(path,"a",newline="")
writer=csv.writer(file)
for i in range(10):
print(i)
writer.writerow(np.array([1,2,i]))
file.close()