1 回答

TA贡献1802条经验 获得超5个赞
您可以尝试以下方法:
使用逐行读取文件
f.readlines()
对于每一行,检查该行是否包含
HEADER
.如果是这种情况,这意味着这是一个新的子 df。将其添加到输出
else: 将当前行追加到当前子数据
将文本格式的 df 列表转换
sub
为 pandas 数据框。这个讨论解释了如何。笔记:将任何“
,
”与“,*
”匹配使用匹配任何所有2 个或更多空间
"\s{2,}
使用的正则表达式是
,*\s{2,}
指:该参数
header=None
是必需的,第一行将用于添加列名称。
完整代码
# import modules
import pandas as pd
from io import StringIO
out = []
with open("data.txt", "r") as f:
sub = ""
for line in f.readlines():
if "HEADER" in line:
# Skip first insertion
if sub != "":
out.append(sub)
sub = ""
else: sub += line
# Append last sub (outside for loop)
out.append(sub)
# "out" is a list of pandas dataframes
out = [pd.read_csv(StringIO(o), sep=r",*\s{2,}", header=None, engine="python") for o in out]
print(out[0])
# 0 1 2
# 0 -10000 15.0 -1.0
print(out[1])
# 0 1 2 3 4
# 0 1 AIR.10000 S25D.1 56.84441 $ AIR CONV
# 1 2 AIR.10000 S25D.2 56.45712 $ AIR CONV
# 2 3 AIR.10000 S25D.3 53.35623 $ AIR CONV
# 3 4 AIR.10000 S25D.4 45.09633 $ AIR CONV
# 4 5 AIR.10000 S25D.9 77.00067 $ AIR CONV
# .. .. ... ... ... ...
# 89 90 AIR.10000 S25D.122 133.79200 $ AIR CONV
# 90 91 AIR.10000 S25D.123 194.22270 $ AIR CONV
# 91 92 AIR.10000 S25D.124 116.83720 $ AIR CONV
# 92 93 AIR.10000 S25D.125 125.51610 $ AIR CONV
# 93 94 AIR.10000 S25D.126 54.22872 $ AIR CONV
# [94 rows x 5 columns]
print(out[1].columns)
# Int64Index([0, 1, 2, 3, 4], dtype='int64')
添加回答
举报