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