0.为什么要入坑Python
早就知道Python好,Python妙,Python用起来呱呱叫。工作上一直没有什么用得上Python的必要性,就一直没有接触,本次终于来了机会:【图新地球桌面端要对外开放Python API】,开放图新地球的三维场景构建能力给到用户,用户可以在图新地球现有功能的基础上专注于做自身业务逻辑的开发。
1.开发环境搭建(1小时)
学习入门的过程比较简单,初步了解,暂时不考虑做界面,主要看一看Python在GIS、数据处理方面有哪些成熟的包。
初步的选择:
- 开发工具:PyCharm
- Python版本:3.11.3(ps:可能后续会降级,作为产品追求的是成熟稳定)
- 系统:Windows11
核心内容:配置Pycharm的中文界面
ps:安装完以后重启Pycharm即可
ps:如果英语比较差的同学,注意看一下列表是否是【marketplace】,在已安装的列表里面肯定是搜索不到的
2.excel文件的解析(5小时)
2.1选择解析Excel文件的包(openpyxl)
直接在pycharm的包里面搜索excel相关的包,关键词用excel、xls、xlsx等,实际匹配结果主要是匹配了python包的名称。
做选择,肯定不能忘了万能的【百度】
看了好多个包的介绍以后,最终选择了openpyxl,文档也相对比较全,用起来也相对比较简单。(其他的包刚跑起来有的就报错了)
https://openpyxl.readthedocs.io/en/stable/
2.2基本Python编码规范(语法)的了解
靠缩进进行编码的方式让我好不适应,关键是变量的定义、函数的定义,try catch的语法等还是需要了解一下的。
Python 教程(https://www.w3school.com.cn/python/index.asp)
ps:现在上面的广告比前几年用的时候要多了。
2.3实现的基本功能
在GIS软件里面操作Excel主要用于读取数据,测绘院、勘察院、规划院、设计院很多数据都还是在excel里面的,而且操作excel的门槛才是最低的。
构思完成以后,主要实现的逻辑就是
- 打开excel
- 遍历工作表(sheet)
- 按行遍历内容
- 获取单元格内容
- 打印输出
代码如下(太简单了,实现了上面所有功能,也不到100行):
# 这是一个最基本的excel读取示例
# 文件路径的打开和关闭
# sheet的切换
# 指定单元格的值的获取与转换(数字、日期、字符串)
# 合并单元格的值情况查看
# 形成一个exe支持输入一个xlsx文件,在命令行里面显示表格的所有内容
# python解析excel的库
import openpyxl
# 打开指定路径的文件
try:
my_workbook = openpyxl.load_workbook(filename="D:\pyprj\mypythonexcel\测试工作表.xlsx")
except:
print("打开D:\pyprj\mypythonexcel\测试工作表.xlsx文件失败")
# 获取对应的工作表Sheet1
# 注意此处一定要区分工作表的名称,中文与大小写要注意清楚,最好都用try cache
try:
my_currentsheet = my_workbook["Sheet1"]
except:
print("Sheet1名称的工作表不存在")
# 获取指定单元格的值
value_row1_col1 = my_currentsheet['A1'].value
# 打印指定单元格的值
print("测试excel文件中Sheet1工作表中的A1单元格的值如下:")
print(value_row1_col1)
# 获取对应的工作表“工作表2”
try:
my_currentsheet = my_workbook["工作表2"]
except:
print("'工作表2'名称的工作表不存在")
# 获取工作表的内容行数与列数
total_row_num_current_sheet = my_currentsheet.max_row
total_column_num_current_sheet = my_currentsheet.max_column
print("测试excel文件中'工作表2'工作表中共计有",total_row_num_current_sheet,"行",total_column_num_current_sheet,"列")
# 获取指定单元格的值,A2(数字)
value_cell_2_1 = my_currentsheet.cell(row=2,column=1)
print("单元格A2‘第二行第一列’的值为:",value_cell_2_1.value)
# 获取指定单元格的值,B2(汉字)
value_cell_2_2 = my_currentsheet.cell(row=2,column=2)
print("单元格B2‘第二行第一列’的值为:",value_cell_2_2.value)
# 获取指定单元格的值,D2(日期)
value_cell_2_4 = my_currentsheet.cell(row=2,column=4)
print("单元格D2‘第二行第一列’的值为:",value_cell_2_4.value)
# 按行遍历输出每一个单元格的值
for cell_row in range(total_row_num_current_sheet):
current_row_value = ""
for cell_col in range(total_column_num_current_sheet):
current_row_value = current_row_value + " " + str(my_currentsheet.cell(row=cell_row+1,column=cell_col+1).value)
print(current_row_value)
# 解析合并的工作表
# 获取对应的工作表“工作表-合并”
try:
my_currentsheet = my_workbook["工作表-合并"]
except:
print("'工作表-合并'名称的工作表不存在")
# 获取工作表的内容行数与列数
total_row_num_current_sheet = my_currentsheet.max_row
total_column_num_current_sheet = my_currentsheet.max_column
# 按行遍历输出每一个单元格的值
for cell_row in range(total_row_num_current_sheet):
current_row_value = ""
for cell_col in range(total_column_num_current_sheet):
current_cell = my_currentsheet.cell(row=cell_row+1,column=cell_col+1)
current_row_value = current_row_value + " " + str(current_cell.value)
print(current_row_value)
# 注意:看了上面的输出,我们知道对于有合并的单元格,该单元格的值是合并单元格的左上角的单元格的值,其他单元格的值都是None
自己造的excel文件如下:
运行结果如下:
示例代码和excel文件后面均可下载
3.打包成exe的过程(pyinstall)(2小时)
操作文件看来不是很难,做好的成果最后还是要用起来的哇,打包也顺带手了解一下,最终选择则了 pyinstaller
包装exe的预期目的是写好的软件放到其他地方也可以用,那就不能把文件路径写死了哇,需要配置一个命令行参数。
3.1命令行参数配置过程
调试模式下如何配置模拟命令行参数
PyCharm小技巧之怎么方便地编辑命令行参数_rec_char_dict_path_梨梨要努力变强的博客-CSDN博客
这里放一张最喜欢的方式截图
最终做的命令行解析:
用的最简单的模式,exe后面直接跟文件路径,getopt未实际使用。
# python解析excel的库
import openpyxl
import sys
import getopt
import os
def parse_xlsx(argv):
# 输入的xlsx文件路径
inputfile = ''
try:
# getopt.getopt(args, shortopts, longopts=[])
# args指的是当前脚本接收的参数,它是一个列表,可以通过sys.argv获得
# shortopts 是短参数 啥是短参数啊? 类似于 这样:python test.py - h # 输出帮助信息
# longopts 是长参数 啥是长参数啊? 类似于 这样:python test.py - help # 输出帮助信息
opts, args = getopt.getopt(argv, "hi:o:", ["ifile=", "ofile="])
if len(args)<2:
print('使用方法:直接输入xlsx绝对路径即可')
sys.exit(0)
# 这里只判断第二个参数是否是一个xlsx的文件路径
inputfile = args[1]
b_is_xlsx = inputfile.endswith(".xlsx")
b_is_xls = inputfile.endswith(".xls")
b_is_exists = os.path.exists(inputfile)
if b_is_exists & (b_is_xlsx | b_is_xls):
3.2 附pyinstaller的安装过程,及个人的踩坑过程
参考:Pycharm生成.exe文件_pycharm生成exe_繁霜银河的博客-CSDN博客
打包工具的配置过程:
ps:这是实操过程中遇到的一个问题,我在命令行里面打包,能成功,但是运行报缺少openpyxl库,用下面的这个方法在配置pyinstaller后,在软件界面上打包就没问题。
pycharm内如何打包py项目为.exe可执行文件_pycharm打包_韵诺的博客-CSDN博客
最后是打包后的结果
源文件及打包的exe、示例excel打包下载地址如下:
https://download.csdn.net/download/xiaopeixiaojun/87937514