近邻算法分类-找离得近的
image.png
缺点1:复杂
缺点2:对特征取离散值表现差
常用的三种距离
image.png
欧氏距离:适用于分类特征距离有明显区别
曼哈顿距离:如果欧氏距离都相等,那么可以考虑曼哈顿,这种距离更稳定
余弦距离:适用于特征值多的情况
python:os.path.expanduser('~')#返回本地账户根目录
image.png
拓展:# [获取当前目录路径和文件](https://www.cnblogs.com/Jomini/p/8636129.html)
1-获取路径
import os
print os.getcwd() #获取当前工作目录路径
print os.path.abspath('.') #获取当前工作目录路径
print os.path.abspath('test.txt') #获取当前目录文件下的工作目录路径
print os.path.abspath('..') #获取当前工作的父目录 !注意是父目录路径
print os.path.abspath(os.curdir) #获取当前工作目录路径
2-改变当前目录
1) 使用: os.chdir(path)。
比如, 如果当前目录在 ‘E:’ 下面, 然后进入E 下面的files 文件 可以使用 os.chdir(E:\files).
之后,使用比如 test1 = open('file1.txt'), 打开的文件会是在这个 ‘E:\files’ 目录下的文件,而不是 'E' 下的文件。
3-组合路径返回
os.path.join('file1','file2','file3')
合并得到路径 file1/file2/file3
................
#enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
>>>i = 0
>>> seq = ['one', 'two', 'three']
>>> for element in seq:
... print i, seq[i]
... i +=1
...
0 one
1 two
2 three
*****************************************************
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
整理文件读取的方式
1-读取文本文件
(1)按路径直接读取,一次性读取文本中全部的内容,以字符串的形式返回结果
>>> f = open('/tmp/test.txt')
>>> f.read()
'hello python!\nhello world!\n'
>>> f.close()
(2)with open读取
with open("test.txt", "r") as f: # 打开文件
data = f.read() # 读取文件
print(data)
(3)只读取文本第一行的内容,以字符串的形式返回结果
with open("test.txt", "r") as f:
data = f.readline()
print(data)
(4)读取文本所有内容,并且以列表的格式返回结果,一般配合for in使用
with open("test.txt", "r") as f:
data = f.readlines()
print(data)
#readlines会读到换行符,可用如下方法去除:
with open("test.txt", "r") as f:
for line in f.readlines():
line = line.strip('\n')
#去掉列表中每一个元素的换行符
print(line)
2-写入文本文件
(1)with open
with open("test.txt","w") as f:
f.write("这是个测试!")
# 自带文件关闭功能,不需要再写f.close()
3-读取csv文件
(2)路径+with open,以list形式读取
# 导包
import csv
# 定义文件路径
csv_path = 'source_file/reg_info.csv'
# 通过with语句读取,以列表类型读取
with open(csv_path,'r',encoding='utf8')as fp:
# 使用列表推导式,将读取到的数据装进列表
data_list = [i for i in csv.reader(fp)]
# csv.reader 读取到的数据是list类型
print(data_list)
(2)以字典类型读取
# 在python3.6版本后,读取到csv文件内容每一行的类型是OrderedDict;可以通过字典的形式取值;
# 在读取过程中会将csv文件内容映射到OrderedDict中,其中OrderedDict中的键可以由fieldnames 定义;
# 如果fieldnames 为None,则OrderedDict的键为csv文件首行内容
with open(csv_path,'r',encoding='utf8')as fp:
# 使用列表推导式,将读取到的数据装进列表
data_list = [i for i in csv.DictReader(fp,fieldnames=None)]
# csv.DictReader 读取到的数据是list类型
print(data_list)
(3)pandas读取
import pandas as pd #导入pandas包
data = pd.read_csv("train.csv") #读取csv文件
print(data)
4-写入csv文件
(1)单行数据写入
# 单行数据写入文件
data_list = ['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功']
with open(csv_path,'a',encoding='utf8')as fp:
write = csv.writer(fp)
write.writerow(data_list) # writerow 所接收的是一个列表
(2)多行数据写入
# 多行数据写入
data_list = [
['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
['15446875965','wwwwwww','vvvvvvvv',1,10001,'注册成功'],
]
with open(csv_path,'a',encoding='utf8')as fp:
write = csv.writer(fp)
write.writerows(data_list) # writerow 所接收的是一个列表
(3)写入带列名
import csv
csvFile = open("csvData.csv", "w") #创建csv文件
writer = csv.writer(csvFile) #创建写的对象
#先写入columns_name
writer.writerow(["index","a_name","b_name"]) #写入列的名称
#写入多行用writerows #写入多行
writer.writerows([[1,a,b],[2,c,d],[3,d,e]])
csvFile.close()
5-读取xls/xlsx文件
(1)利用openpyxl
#导入
from openpyxl import workbook
from openpyxl import load_workbook
#打开一个工作表
wb = load_workbook('filenamename.xlsx')
#获取sheet
sheet = wb.get_sheet_by_name('sheet1')
#获取某个值
print(sheet['A1'].value)
#获取表最大行数
print(sheet.max_row)
#获取表最大列数
print(sheet.max_column)
#打印某列值
for i in sheet['C']:
print(i.value,'')
print('')
#打印某行值
for i in sheet['1']:
print(i.value,'')
print('')
(2)自定义函数
读取excel表格数据需要用到xlrd或者openpyxl模块,所以先安装xlrd/openpyxl:直接pip install xird/openpyxl
xlrd和openpyxl区别:
(2.1).xlrd能处理的最大行数为65535,超过这个行数的文件就需要用到openpyxl,openpyxl最大支持1048576行
(2.2).openpyxl不支持xls格式文件
xlrd模块常用方法介绍:
打开excl文件:s = xlrd.open_workbook(“文件路径”)
获取表格:s.sheets()[0] = s.sheet_by_index(0) 获取第一张表格; 注意:下标值是从0开始
s.sheet():获取所以表单的索引
sheet = s.sheet_by_name("表名") 获取指定表名的表
获取表格的总行数:sheet.nrows
获取表格的总列数:sheet.ncols
获取指定行的数据:sheet.row_values(下标值),sheet.row_values(0,1,3)表示从去第2,3,4行的值
获取指定行的数据:sheet.col_values(下标值)
获取指定单元格数据:sheet.cell(a,b).value a表示行的下标值,b表示列的下标值;两者可以调换位置;注意:不加.value取出的值前面会带个text的东西
1.导入xlrd模块
2.通过open.workbook()方法打开文件
3.通过sheets()[]方法获取想要的表格
4.获取总行数和总列数
5.取第一行的值作为字典的key
6.通过2个循环来根据行取对应列的值
代码如下:
import xlrd
data = []
def read_xsls(xlsx_path):
data_xsls = xlrd.open_workbook(xlsx_path) #打开此地址下的exl文档
sheet_name = data_xsls.sheets()[0] #进入第一张表
print(sheet_name)
sheet_name1 = data_xsls.sheet_by_index(0)
print(sheet_name1)
count_nrows = sheet_name.nrows #获取总行数
# print(count_nrows)
count_nocls = sheet_name.ncols #获得总列数
line_value = sheet_name.row_values(0)
for i in range(1,count_nrows):
data_1 = {}
for j in range(2,count_nocls):
data_1[line_value[j]]=sheet_name.cell(i,j) #根据行数来取对应列的值,并添加到字典中
# print(data_1)
data.append(data_1)
# print(data)
(3)自定义函数
'''
读取XLS,XLSX文件
'''
import xlrd
def readExcelFile(filename):
# 打开工作表
workbook = xlrd.open_workbook(filename=filename)
# 用索引取第一个工作薄
booksheet = workbook.sheet_by_index(0)
# 返回的结果集
for i in range(booksheet.nrows):
print(booksheet.row_values(i))
第6行,xlrd.open_workbook打开一个已经存在的excel文件,文件不存在会造成打开失败。
第8行,通过索引获取工作薄对象,workbook.sheet_by_index;也可以通过名称获取工作薄,workbook.sheet_by_name
第10行,booksheet.nrows获取工作薄的总行数,同样的,booksheet.ncols获取工作薄的总列数
第11行,booksheet.row_values(i)获取一整行的内容
(4)自定义函数
import xlrd
from xlrd import xldate_as_tuple
import datetime
#导入需要读取的第一个Excel表格的路径
data1 = xlrd.open_workbook(r'C:\Users\NHT\Desktop\Data\\test.xlsx')
table = data1.sheets()[0]
#创建一个空列表,存储Excel的数据
tables = []
#将excel表格内容导入到tables列表中
def import_excel(excel):
for rown in range(excel.nrows):
array = {'road_name':'','bus_plate':'','timeline':'','road_type':'','site':''}
array['road_name'] = table.cell_value(rown,0)
array['bus_plate'] = table.cell_value(rown,1)
if table.cell(rown,2).ctype == 3:
date = xldate_as_tuple(table.cell(rown,2).value,0)
array['timeline'] = datetime.datetime(*date)
array['road_type'] = table.cell_value(rown,3)
array['site'] = table.cell_value(rown,4)
tables.append(array)
if __name__ == '__main__':
#将excel表格的内容导入到列表中
import_excel(table)
for i in tables:
print(i)
5-写入xls/xlsx文件
(1)自定义函数
import xlwt
'''
写XLS,XLSX文件
@filename 文件名
@header 列头
@content 内容
'''
def writeExcelFile(filename, header, content):
# 因为输入都是Unicode字符,这里使用utf-8,免得来回转换
workbook = xlwt.Workbook(encoding='utf-8')
booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)
# 写列头
row = 0
for col in range(len(header)):
booksheet.write(row, col, header[col])
# 写内容
for lines in content:
row += 1
for col in range(len(lines)):
booksheet.write(row, col, lines[col])
# 保存文件
workbook.save(filename)
写excel文件的大致过程是
1. xlwt.Workbook 先建一个workbook对象
2. 添加工作薄 workbook.add_sheet
3. 写单元格 booksheet.write(row, col, text)
4. 保存文件 workbook.save
#excel操作大全:https://blog.csdn.net/qq_34617032/article/details/80433939
(2)利用pyExcelerator
#coding=utf-8
#######################################################
#filename:test_pyExcelerator.py
#author:defias
#date:xxxx-xx-xx
#function:新建excel文件并写入数据
#######################################################
import pyExcelerator
#创建workbook和sheet对象
wb = pyExcelerator.Workbook()
ws = wb.add_sheet(u '第一页' )
#设置样式
myfont = pyExcelerator.Font()
myfont.name = u 'Times New Roman'
myfont.bold = True
mystyle = pyExcelerator.XFStyle()
mystyle.font = myfont
#写入数据,使用样式
ws.write( 0 , 0 ,u 'ni hao 帕索!' ,mystyle)
#保存该excel文件,有同名文件时直接覆盖
wb.save( 'E:\\Code\\Python\\mini.xls' )
print( '创建excel文件完成!')
1-操作xls文件
# coding=UTF-8
import xlrd
import xlwt
from xlutils.copy import copy
def write_excel_xls(path, sheet_name, value):
index = len(value) # 获取需要写入数据的行数
workbook = xlwt.Workbook() # 新建一个工作簿
sheet = workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
sheet.write(i, j, value[i][j]) # 像表格中写入数据(对应的行和列)
workbook.save(path) # 保存工作簿
print("xls格式表格写入数据成功!")
def write_excel_xls_append(path, value):
index = len(value) # 获取需要写入数据的行数
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
for i in range(0, index):
for j in range(0, len(value[i])):
new_worksheet.write(i+rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入
new_workbook.save(path) # 保存工作簿
print("xls格式表格【追加】写入数据成功!")
def read_excel_xls(path):
workbook = xlrd.open_workbook(path) # 打开工作簿
sheets = workbook.sheet_names() # 获取工作簿中的所有表格
worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格
for i in range(0, worksheet.nrows):
for j in range(0, worksheet.ncols):
print(worksheet.cell_value(i, j), "\t", end="") # 逐行逐列读取数据
print()
book_name_xls = 'xls格式测试工作簿.xls'
sheet_name_xls = 'xls格式测试表'
value_title = [["姓名", "性别", "年龄", "城市", "职业"],]
value1 = [["张三", "男", "19", "杭州", "研发工程师"],
["李四", "男", "22", "北京", "医生"],
["王五", "女", "33", "珠海", "出租车司机"],]
value2 = [["Tom", "男", "21", "西安", "测试工程师"],
["Jones", "女", "34", "上海", "产品经理"],
["Cat", "女", "56", "上海", "教师"],]
write_excel_xls(book_name_xls, sheet_name_xls, value_title)
write_excel_xls_append(book_name_xls, value1)
write_excel_xls_append(book_name_xls, value2)
read_excel_xls(book_name_xls)
2-操作xlsx文件
# coding=UTF-8
import openpyxl
def write_excel_xlsx(path, sheet_name, value):
index = len(value)
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = sheet_name
for i in range(0, index):
for j in range(0, len(value[i])):
sheet.cell(row=i+1, column=j+1, value=str(value[i][j]))
workbook.save(path)
print("xlsx格式表格写入数据成功!")
def read_excel_xlsx(path, sheet_name):
workbook = openpyxl.load_workbook(path)
# sheet = wb.get_sheet_by_name(sheet_name)这种方式已经弃用,不建议使用
sheet = workbook[sheet_name]
for row in sheet.rows:
for cell in row:
print(cell.value, "\t", end="")
print()
book_name_xlsx = 'xlsx格式测试工作簿.xlsx'
sheet_name_xlsx = 'xlsx格式测试表'
value3 = [["姓名", "性别", "年龄", "城市", "职业"],
["111", "女", "66", "石家庄", "运维工程师"],
["222", "男", "55", "南京", "饭店老板"],
["333", "女", "27", "苏州", "保安"],]
write_excel_xlsx(book_name_xlsx, sheet_name_xlsx, value3)
read_excel_xlsx(book_name_xlsx, sheet_name_xlsx)
网友评论