从txt fi中一系列行之间的值构造数据帧

2024-06-06 05:15:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难从txt文件中的非结构化行获取值。Alpha和Beta是我的数据引用的关键,X_1,X_2,X_3是我需要从文件中获取的变量(只是简化一下,在实际数据中有192个变量)。你知道吗

我想把每个xun(n=1,2,3)的最后一个值(用空格分隔)提取到每个Alpha和Beta值对的dict中。多多少少能得到这样的3D面板。 desirable dataframe

一排排的绳子文件.txt如下所示的文件(解析后):

Alpha = 180
Beta = 0
X_1 3.34 5
X_3 4.34 7
Alpha = 180
Beta = 10
X_1 4.23 2
X_2 3.23 1 
Alpha = 180
Beta = 20
X_2 3.23 9
.
.
.
.
Alpha = 180
Beta = 90
X_1 7.23 3
X_2 9.14 3
X_3 5.91 7 
Alpha = 170
Beta = 0
X_1 7.63 3
X_2 4.84 2
X_3 8.01 8 
.
. 
(and so on)

我的目标是创建三维面板如下

Alpha Beta x_1 x_2 x_3
180    0     5   0   7
180    10    2   1   0
180    20    0   0   9

180    90    3   3   7
170     0    3   2   8

我已经尽力了。我可以使用regex得到X_1,X_2 X_3的值

readings = []
with open('file.txt') as inputfile:
    for line in inputfile:
    readings.append(line.strip())

x_1_list =[]
for r in readings:
    if re.search('x_1,r')
        c = re.split(r'\s+',r)[-1]
        x_1_list.append(c)
    else:
        x_1_list.append(0.0)

但是,我不能为每个Alpha和Beta值使用for循环这个函数。你知道吗

有什么建议吗?你知道吗


Tags: 文件数据inalpharetxt面板for
1条回答
网友
1楼 · 发布于 2024-06-06 05:15:35

我建议将输入文件解析为['Alpha'、'Beta'、'X_1'、'X_2'、'X_3']值的组,即按组而不是逐行。你知道吗

下面是工作代码。我希望它能解释自己,但请评论,如果它需要澄清。你知道吗

KEYS = ['Alpha', 'Beta', 'X_1', 'X_2', 'X_3']
GROUP_START_MARKER = KEYS[0]


def parse_group(handle, line):
    value_dict = {}
    assert line.startswith(GROUP_START_MARKER)
    alpha_value = line.split(' = ')[1]
    value_dict[GROUP_START_MARKER] = alpha_value
    line = handle.readline().strip()
    assert line.startswith('Beta')
    beta_value = line.split(' = ')[1]
    value_dict['Beta'] = beta_value
    readings = []
    while True:
        line = handle.readline().strip()
        if line.startswith(GROUP_START_MARKER):
            break
        if not line:
            break
        key, _, value = line.split()
        value_dict[key] = value
    return value_dict, line


def parse_file(filename):
    value_list = []
    with open(filename) as inputfile:
        line = inputfile.readline().strip()
        while True:
            if line.startswith(GROUP_START_MARKER):
                value_dict, line = parse_group(inputfile, line)
                if not line:
                    return
                yield value_dict


it = parse_file('file.txt')
print '\t'.join(KEYS)
for value_dict in it:
    print '\t'.join(map(str, [value_dict.get(key, 0.0) for key in KEYS]))

相关问题 更多 >