python - 使用 Python 从具有独特标题打印技术(.inp 扩展名)的文件中解析标题字符串
问题描述
我希望使用 Python 从文件中解析数据帧(对于那些可能使用过的人,它的 SWMM 模型输入/inp 文件)。文件头以一种相当独特的方式打印,这使得完全解析它变得非常困难。我试图从文件中读取的带有麻烦标题的数据框的示例是:
;; Param
;;Node Parameter Time Series Type
;;-------------- ---------------- ---------------- --------
80408 FLOW 80408 FLOW
81009 FLOW 81009 FLOW
82309 FLOW 82309 FLOW
标题不由制表符或任何固定数量的空格分隔。另外,对于一些长度过大的表头,它们占据了垂直的两行,而其他表头只使用了一行。宽度也不是固定的,有不止一个这样的数据框,它们的宽度都不同。
我所能做的就是抓住最底部的行作为标题。
with open(inp_fname, 'r') as f:
for line in f:
headers = re.split("\s{2,}", line.replace(';',"").strip())
解决方案
由于您的数据不适合插值,read_fwf
您可以自己扫描和解析标题。计算出列名和宽度后,您可以将它们传递给read_fwf
在第一个实际行上打开的文件指针。标题和数据之间的虚线分隔符是一个很好的列宽指标,所以我用它来计算列宽。
import pandas as pd
import re
# write a test file...
open('test.txt', 'w').write("""\
;; Param
;;Node Parameter Time Series Type
;;-------------- ---------------- ---------------- --------
80408 FLOW 80408 FLOW
81009 FLOW 81009 FLOW
82309 FLOW 82309 FLOW """)
def make_dataframe(filename):
with open('test.txt') as fp:
# grab header
headers = []
for line in fp:
if not line.startswith(';;-'):
# header line, swap ' ' for ';;' to maintain len
headers.append(' ' + line[2:-1])
else:
break
else:
print("ERROR: Header separator not found")
return None
# end of header, convert '----' separators to field lengths
field_lens = [len(m)+1 for m in re.findall(r"\-+", '--' + line[2:-1])]
# flatten multiline column names
start = 0
pd_header = []
for f_len in field_lens:
pd_header.append(' '.join(field.strip()
for field in (h[start:start+f_len] for h in headers)
if field.strip()))
start += f_len
# read fix length columns
df = pd.read_fwf(fp, header=None, names=pd_header, widths=field_lens,
index_col=False)
return df
df = make_dataframe('test.txt')
print(df)
推荐阅读
- architecture - 从 16 位架构过渡到 32 位和 64 位架构的原因
- amazon-web-services - Terraform 在条件为假后不破坏资源
- reactjs - 我在 React 中的 State 变量,其数据类型为数组,其 setter 应该作为 push() 对数组不起作用
- c# - 什么是从 C# 中的 SQLite 数据库获取 REAL/DOUBLE 类型值的好方法
- javascript - 如何在反应中的两个子组件之间传递数据
- amazon-web-services - EC2:连接服务器失败
- python - 如何使用 powershell/Windows 终端在 vscode 中调试(Python)程序?
- azure - 是否以编程方式为 azure 中的 VM 制定更新 agnet 准备情况?
- python-3.x - “next”的重载变体不匹配参数类型 List[Scene]
- websocket - 币安期货 ACCOUNT_UPDATE 流交易通过 websocket 问题?