如何用Python读取inp文件中Face9下方至星号间的数值行?
需要读取并打印inp文件中特定区间的数值行,读取范围为Face9所在行下方至一行连续星号(***********************************************************)之间的内容,要求以星号作为结束定位参数。此前尝试使用find()和seek()函数定位Face9的位置,但调用seek()跳转后无法正确获取目标数值,出现位置不匹配的问题。
目标数据段示例:
** constraints force node loads
*CLOAD
** ConstraintForce
** node loads on shape: Connect:Face9
10,1,0.0000000000000E+00
11,1,0.0000000000000E+00
26,1,0.0000000000000E+00
27,1,0.0000000000000E+00
80,1,6.2500000000000E+01
152,1,0.0000000000000E+00
153,1,0.0000000000000E+00
154,1,0.0000000000000E+00
155,1,6.2500000000000E+01
156,1,6.2500000000000E+01
157,1,6.2500000000000E+01
158,1,6.2500000000000E+01
159,1,0.0000000000000E+00
160,1,0.0000000000000E+00
161,1,0.0000000000000E+00
162,1,6.2500000000000E+01
163,1,6.2500000000000E+01
164,1,6.2500000000000E+01
165,1,6.2500000000000E+01
166,1,6.2500000000000E+01
424,1,1.2500000000000E+02
425,1,1.2500000000000E+02
426,1,1.2500000000000E+02
427,1,1.2500000000000E+02
428,1,1.2500000000000E+02
429,1,1.2500000000000E+02
430,1,1.2500000000000E+02
不推荐使用seek()和find()处理文本文件的行定位——不同操作系统的换行符(\n/\r\n)会导致字节计数偏移,容易出现位置不匹配的问题。更可靠的方式是逐行读取文件,通过状态标记筛选目标内容,以下是Python实现示例:
STAR_LINE = "***********************************************************" TARGET_MARKER = "Face9" with open("your_file.inp", "r") as f: collect = False for line in f: stripped_line = line.strip() # 检测到Face9所在行,开启收集状态 if TARGET_MARKER in line: collect = True continue # 跳过Face9所在行本身 # 检测到结束星号行,停止收集 if stripped_line == STAR_LINE and collect: break # 处于收集状态且非空行,打印或处理内容 if collect and stripped_line: print(stripped_line)
代码说明
- 定义
STAR_LINE为结束标记的星号行,TARGET_MARKER为起始定位的关键词 - 用
collect布尔变量标记是否进入目标数据区间 - 逐行读取时:
- 遇到包含
Face9的行,开启收集状态并跳过该行 - 遇到匹配的星号行且处于收集状态时,终止循环
- 收集状态下,打印非空的数值行
- 遇到包含
这种方法完全基于行内容判断,不受换行符差异影响,能精准定位目标区间。
内容的提问来源于stack exchange,提问作者OzkanCanli

