參考文章《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)