gpt4 book ai didi

python - 在python中递归收集字符串 block

转载 作者:行者123 更新时间:2023-12-01 03:48:06 25 4
gpt4 key购买 nike

我有一个格式如下的自定义数据文件:

{
data = {
friends = {
max = 0 0,
min = 0 0,
},
family = {
cars = {
van = "honda",
car = "ford",
bike = "trek",
},
presets = {
location = "italy",
size = 10,
travelers = False,
},
version = 1,
},
},
}

我想收集数据 block ,即每组 {} 之间的字符串,同时保持层次结构。该数据不是典型的 json 格式,因此这不是一个可能的解决方案。

我的想法是创建一个像这样的类对象

class Block:
def __init__(self, header, children):
self.header = header
self.children = children

然后我会“以某种方式”逐行循环数据,收集必要的数据,这样我的输出结果就会像这样......

Block("data = {}", [
Block("friends = {max = 0 0,\n min = 0 0,}", []),
Block("family = {version = 1}", [...])
])

简而言之,我正在寻求帮助,以了解如何将其序列化为可以轻松操作的有用数据。所以我的方法是通过使用 {} 作为分隔符来分解对象。如果有人对如何更好地解决这个问题有建议,我会全力以赴。再次感谢您。

到目前为止,我刚刚实现了基本的代码片段

class Block:
def __init__(self, content, children):
self.content = content
self.children = children

def GetBlock(strArr=[]):
print len(strArr)
# blocks = []
blockStart = "{"
blockEnd = "}"

with open(filepath, 'r') as file:
data = file.readlines()
blocks = GetBlock(strArr=data)

最佳答案

您可以创建一个 to_block 函数,该函数将文件中的行作为迭代器,并根据这些行递归地创建嵌套字典。 (当然,您也可以使用自定义 Block 类,但我并没有真正看到这样做的好处。)

def to_block(lines):
block = {}
for line in lines:
if line.strip().endswith(("}", "},")):
break
key, value = map(str.strip, line.split(" = "))
if value.endswith("{"):
value = to_block(lines)
block[key] = value
return block

不过,在调用它时,您必须删除第一行。另外,评估“叶子”,例如数字或字符串留给读者作为练习。

>>> to_block(iter(data.splitlines()[1:]))
{'data': {'family': {'version': '1,',
'cars': {'bike': '"trek",', 'car': '"ford",', 'van': '"honda",'},
'presets': {'travelers': 'False,', 'size': '10,', 'location': '"italy",'}},
'friends': {'max': '0 0,', 'min': '0 0,'}}}

或者从文件读取时:

with open("data.txt") as f:
next(f) # skip first line
res = to_block(f)
<小时/>

或者,您可以进行一些预处理,将该字符串转换为 JSON(-ish) 字符串,然后使用 json.loads。但是,我不会一路走到这里,而只是将值包装到 "" 中(并在此之前将原始的 " 替换为 ' ),否则不小心将带有空格的字符串转换为列表或类似内容的风险太大。创建 JSON 数据后,您可以对它们进行排序。

>>> data = data.replace('"', "'")
>>> data = re.sub(r'= (.+),$', r'= "\1",', data, flags=re.M)
>>> data = re.sub(r'^\s*(\w+) = ', r'"\1": ', data, flags=re.M)
>>> data = re.sub(r',$\s*}', r'}', data, flags=re.M)
>>> json.loads(data)
{'data': {'family': {'version': '1',
'presets': {'size': '10', 'travelers': 'False', 'location': "'italy'"},
'cars': {'bike': "'trek'", 'van': "'honda'", 'car': "'ford'"}},
'friends': {'max': '0 0', 'min': '0 0'}}}

关于python - 在python中递归收集字符串 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38658470/

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