gpt4 book ai didi

python - 在Python中从文本文件读取数据并将其写入numpy列

转载 作者:行者123 更新时间:2023-12-01 04:50:06 24 4
gpt4 key购买 nike

我一直在努力寻找适用于以下文本文件格式的东西。我的总体目标是提取整个文本文件中变量名称之一的值。例如,我想要 B 行和 D 行的所有值。然后将它们放入普通的 numpy 数组中并运行计算。

数据文件如下所示:

[SECTION1a]
[a] 1424457484310
[b] 5313402937
[c] 873348378938
[d] 882992596992
[e] 14957596088
[SECTION1b]
243 62 184 145 250 180 106 208 248 87 186 137 127 204 18 142 37 67 36 72 48 204 255 30 243 78 44 121 112 139 76 71 131 50 118 10 42 8 67 4 98 110 37 5 208 104 56 55 225 56 0 102 0 21 0 156 0 174 255 171 0 42 0 233 0 50 0 254 0 245 255 110
[END SECTION1]
[SECTION2a]
[a] 1424457484310
[b] 5313402937
[c] 873348378938
[d] 882992596992
[e] 14957596088
[SECTION2b]
243 62 184 145 250 180 106 208 248 87 186 137 127 204 18 142 37 67 36 72 48 204 255 30 243 78 44 121 112 139 76 71 131 50 118 10 42 8 67 4 98 110 37 5 208 104 56 55 225 56 0 102 0 21 0 156 0 174 255 171 0 42 0 233 0 50 0 254 0 245 255 110
[END SECTION2]

这种模式持续了 N 个部分。

目前我读取了该文件并将其分成两列:

filename_load = fileopenbox(msg=None, title='Load Data File',
default="Z:\*",
filetypes=None)

col1_data = np.genfromtxt(filename_load, skip_header=1, dtype=None,
usecols=(0,), usemask=True, invalid_raise=False)

col2_data = np.genfromtxt(filename_load, skip_header=1, dtype=None,
usecols=(1,), usemask=True, invalid_raise=False)

然后我将使用 where 来查找我想要的值的索引,然后创建这些值的新数组:

arr_index = np.where(col1_data == '[b]')
new_array = col2_data[arr_index]

问题是,由于奇怪的文件格式,我最终得到了两种不同大小的数组,因此显然数组中的数据无法与正确的变量名称正确匹配。

我尝试了其他一些替代方案,但由于奇怪的文本文件格式以及如何将其读入 python 而陷入困境。

不确定我是否应该留在这个轨道上,如果是的话如何解决问题,或者尝试一种完全不同的方法。

提前致谢!

最佳答案

将数据排序到 OrdedDict() 字典层次结构中的可能解决方案:

from collections import OrderedDict
import re


ss = """[SECTION1a]
[a] 1424457484310
[b] 5313402937
[c] 873348378938
[d] 882992596992
[e] 14957596088
[SECTION1b]
243 62 184 145 250 180 106 208 248 87 186 137 127 204 18 142 37 67 36 72 48 204 255 30 243 78 44 121 112 139 76 71 131 50 118 10 42 8 67 4 98 110 37 5 208 104 56 55 225 56 0 102 0 21 0 156 0 174 255 171 0 42 0 233 0 50 0 254 0 245 255 110
[END SECTION1]
[SECTION2a]
[a] 1424457484310
[b] 5313402937
[c] 873348378938
[d] 882992596992
[e] 14957596088
[SECTION2b]
243 62 184 145 250 180 106 208 248 87 186 137 127 204 18 142 37 67 36 72 48 204 255 30 243 78 44 121 112 139 76 71 131 50 118 10 42 8 67 4 98 110 37 5 208 104 56 55 225 56 0 102 0 21 0 156 0 174 255 171 0 42 0 233 0 50 0 254 0 245 255 110
[END SECTION2]"""

# regular expressions for matching SECTIONs
p1 = re.compile("^\[SECTION[0-9]+a\]")
p2 = re.compile("^\[SECTION[0-9]+b\]")
p3 = re.compile("^\[END SECTION[0-9]+\]")

def parse(ss):
""" Make hierachial dict from string """
ll, l_cnt = ss.splitlines(), 0
d = OrderedDict()
while l_cnt < len(ll): # iterate through lines
l = ll[l_cnt].strip()
if p1.match(l): # new sub dict for [SECTION*a]
dd, nn = OrderedDict(), l[1:-1]
l_cnt += 1
while (p2.match(ll[l_cnt].strip()) is None and
p3.match(ll[l_cnt].strip()) is None):
ww = ll[l_cnt].split()
dd[ww[0][1:-1]] = int(ww[1])
l_cnt += 1
d[nn] = dd
elif p2.match(l): # array of ints for [SECTION*b]
d[l[1:-1]] = [int(w) for w in ll[l_cnt+1].split()]
l_cnt += 2
elif p3.match(l):
l_cnt += 1
return d

dd = parse(ss)

请注意,如果您使用现有的解析工具(例如 Parsley ),您可以获得更强大的代码。

要从所有部分检索'[c]',请执行以下操作:

print("All entries for [c]: ", end="")
cc = [d['c'] for s,d in dd.items() if s.endswith('a')]
print(", ".join(["{}".format(c) for c in cc]))
# Gives: All entries for [c]: 873348378938, 873348378938

或者你可以遍历整个字典:

def print_recdicts(d, tbw=0):
"""print the hierachial dict """
for k,v in d.items():
if type(v) is OrderedDict:
print(" "*tbw + "* {}:".format(k))
print_recdicts(v, tbw+2)
else:
print(" "*tbw + "* {}: {}".format(k,v))

print_recdicts(dd)
# Gives:
# * SECTION1a:
# * a: 1424457484310
# * b: 5313402937
# ...

关于python - 在Python中从文本文件读取数据并将其写入numpy列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651896/

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