从 txt 文件中的一系列行之间的值构造 DataFrame
Construct DataFrame from values between a sequence of line in txt file
我很难从 txt 文件中的非结构化行中获取值。 Alpha 和 Beta 是我的数据引用的关键,X_1、X_2、X_3 是我需要从文件中获取的变量(只是简化,在实际数据中有 192 个变量).
我想将每个 X_n (n=1,2,3) 的最后一个值(以空格分隔)提取到每对 Alpha 和 Beta 值的字典中。或多或少地获得像这样的 3D 面板。
desirable dataframe
file.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)
我的目标是创建如下所示的 3D 面板
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 值使用循环此函数。
有什么建议吗?
我建议将输入文件解析为 ['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]))
我很难从 txt 文件中的非结构化行中获取值。 Alpha 和 Beta 是我的数据引用的关键,X_1、X_2、X_3 是我需要从文件中获取的变量(只是简化,在实际数据中有 192 个变量).
我想将每个 X_n (n=1,2,3) 的最后一个值(以空格分隔)提取到每对 Alpha 和 Beta 值的字典中。或多或少地获得像这样的 3D 面板。 desirable dataframe
file.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)
我的目标是创建如下所示的 3D 面板
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 值使用循环此函数。
有什么建议吗?
我建议将输入文件解析为 ['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]))