gpt4 book ai didi

python - 使用 Python 从具有独特标题打印技术(.inp 扩展名)的文件中解析标题字符串

转载 作者:太空宇宙 更新时间:2023-11-04 00:17:28 29 4
gpt4 key购买 nike

我希望使用 Python 从文件中解析数据框(对于那些可能使用过的人,它的 SWMM 模型输入/inp 文件)。文件头以一种相当独特的方式打印,这使得完全解析它变得非常困难。我试图从文件中读取的带有麻烦 header 的数据框示例是:

;;                                                 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 中的插值,您可以自己扫描并解析 header 。计算出列名和宽度后,您可以将它们传递给 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)

关于python - 使用 Python 从具有独特标题打印技术(.inp 扩展名)的文件中解析标题字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399683/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com