欢迎大家和我留言或邮箱联系讨论呀~
mike模型是水文分析的重要模型,但是输入数据需要以固定txt格式输入。
网上的代码都是要不然写的不清楚用不了,要不然让联系有偿使用代码。
所以自己花了点时间写了一下。代码里面注释部分已经写的比较清楚啦,如果有同学使用时候报错可以邮箱或者微信联系我(免费的哈),欢迎大家联系,互相学习互相进步。
来先看一下效果:
![bb0ca3759a5335c895cb7a49593bf07f.png](https://i-blog.csdnimg.cn/blog_migrate/4dd2d43f68a5a708e5cd08c345e1834f.jpeg)
![99743dc30ffe04c5f7abf9dea28593ca.png](https://i-blog.csdnimg.cn/blog_migrate/b5b721ead6a90620ad3bf77d488e8a0c.jpeg)
代码如下:
#----------------------------------------
#名称:mike11模型excel数据自动处理成txt格式
#分类:Python 脚本
#联系人:沙特
#Email: shate1018@126.com
#wechat:yigubigu_y
#----------------------------------------
import xlrd
import xlwt
import pandas as pd
# -------------------------参数设置---------------------------------
title_start = 2 # 头起始行数-1
title_num = 38 # 头终止行数
end_num = -1 # 每个section结束的位置。-1为初值
profile = 0 # 每个section_id中的数据行数
MIN = 6666.66 # 最小_初值
# -------------------------创建打开txt--------------------------------
txt_path = "mike11.txt"
excel_path = "然则日阿错整理文件(3).xlsx"
f = open(txt_path, 'a')
workbook = xlrd.open_workbook(excel_path)
sheet = workbook.sheet_by_name("Sheet1")
'''
注意:
title_start,title_num两个需要手动赋值
txt_path:
需要赋路径,默认路径在脚本文件中的同名txt文件,并以追加形式写入
如果不存在则自动创建
需要处理文件多的话建议手动创建
excel_path:
需要赋路径,如果只给文件名称则默认在脚本文件所在目录中查找
如果不存在则报错,不会自动创建
'''
# 头循环
for i in range(title_start, title_num):
data_row_title = sheet.row(i)
print(f"头名:{data_row_title[0].value}")
# 将第i行数据按格式写入txt文件
f.write("Topo2020n")
f.write("Rivernamen")
f.write(f" {str(data_row_title[1].value)}")
f.write("n")
f.write("COORDINATESn")
f.write(" 0n")
f.write("FLOW DIRECTIONn")
f.write(" 0n")
f.write("PROTECT DATAn")
f.write(" 0n")
f.write("DATUMn")
f.write(" 0.00n")
f.write("RADIUS TYPEn")
f.write(" 0n")
f.write("DIVIDE X-Sectionn")
f.write("0n")
f.write("SECTION IDn")
f.write(f" {str(data_row_title[0].value)}")
f.write("n")
f.write("INTERPOLATEDn")
f.write(" 0n")
f.write("ANGLEn")
f.write(" 0.00 0n")
f.write("RESISTANCE NUMBERSn")
f.write(" 0 0 1.000 1.000 1.000 1.000 1.000n")
# 计算第i行头文件中对应的数据行数
for k in range(title_num + profile, sheet.nrows):
print(f"k:{k}")
data_row_body = sheet.row(k)
if data_row_body[0].value == data_row_title[0].value:
k_start_value = k
print(f"k_start:{k_start_value}")
if data_row_body[2].value == -1:
k_ended_value = k
print(f"k_ended:{k_ended_value}")
PROFILE = k_ended_value - k_start_value
f.write(f"PROFILE {PROFILE}")
print(f"PROFILE {PROFILE}")
f.write("n")
break
else:
continue
#获取截面最小值
for s in range(title_num + profile + 1, sheet.nrows):
data_row_body = sheet.row(s)
print(f"value:{data_row_body[1].value}")
# if data_row_body[2].value == -1:
# break
if data_row_body[1].value <= MIN:
MIN = data_row_body[1].value
if data_row_body[2].value == -1:
break
print(f"MIN:{MIN}")
# 访问头数据对应数据得到"#n"
for m in range(title_num+profile+1, sheet.nrows):
data_row_body = sheet.row(m)
if data_row_body[2].value == -1:
end_num = m
# f.writelines(str(data_row_body[0].value))
f.writelines('%.4f'% data_row_body[0].value)
f.write(f" {'%.4f'% data_row_body[1].value}")
f.write(" 1.000")
if m == title_num + profile +1:
f.write(" <#1>")
elif data_row_body[1].value == MIN:
f.write(" <#2>")
elif m == end_num:
f.write(" <#4>")
else:
f.write(" <#0>")
f.write(" 0 0.000 0")
f.write("n")
if data_row_body[2].value == -1:
break
# 最小值复位
MIN = 6666.66
profile = PROFILE + profile + 1
f.write("Level PARAMSn")
f.write("0 0 0.000 0 0.000 50n")
f.write("*******************************n")