python使用xlrd和xlwt模块对Excel文件读写(实例:将点座标转为无向图距离)

参考文章《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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章