参考文章《python使用xlrd和xlwt模块对Excel文件读写详解》
一、数据与目标
数据是这样的,A列是城市序号1-20,B列是城市的x坐标,C列是城市的y坐标。
我要做的是通过每个城市间的坐标计算每2个城市间的距离,做出如下的无向图表(数据对称,对角线为方便数据处理,赋值为接近于0的无穷小1e-4)
二、代码
1、先读取excel文件并处理
import xlrd
# 打开一个excel文件作为工作簿
workbook = xlrd.open_workbook("cityData.xlsx")
# 输出全部sheet的名字(sheet名字显示在左下角)
print(workbook.sheet_names())
# 按照名字找到你想要的sheet作为数据表
Data_sheet = workbook.sheet_by_name("Sheet1")
rowNum = Data_sheet.nrows # sheet行数
colNum = Data_sheet.ncols # sheet列数
print('sheet行数:', rowNum)
print('sheet列数:', colNum)
# 接下来进入正题,先定义一个numpy矩阵,长宽都和城市个数rowNum一样
import numpy as np
D = np.zeros((rowNum, rowNum))
# 两两配对,从Data_sheet算出城市间距,赋值到矩阵D中
import math
for i in range(rowNum):
for j in range(rowNum):
if j != i: # 欧式距离,对称
DeltaX = Data_sheet.cell(i, 1).value - Data_sheet.cell(j, 1).value
DeltaY = Data_sheet.cell(i, 2).value - Data_sheet.cell(j, 2).value
D[i, j] = math.sqrt(DeltaX ** 2 + DeltaY ** 2)
# 下面这个注释的方法也可以完成同样的功能
# D[i, j] = math.sqrt(Data_sheet.cell_value(i, 0)**2 + Data_sheet.cell_value(j, 0)) ** 2)
else: # 对角线值设为无穷小, 但!=0
D[i, j] = 1e-4
print(D)
2、再输出到指定excel文件
import xlwt
# 输出
toPath = "distance.xls"
toWorkbook = xlwt.Workbook(encoding='utf-8')
toData_sheet = toWorkbook.add_sheet("Sheet1")
for i in range(rowNum):
for j in range(rowNum):
toData_sheet.write(i, j, D[i, j]) # .write(要写的行,要写的列,要写的值)
# 保存
toWorkbook.save(toPath)