python读写-datas.数据集和csv文件-预处理kddcup99

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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值