Python 将重复字段的值放入数组中
我有一个这种格式的文件Python 将重复字段的值放入数组中,python,Python,我有一个这种格式的文件 dn: abvf changetype: a objectclass: in objectclass: c objectclass: cdsUser objectclass: or objectclass: Person objectclass: nd objectclass: Top ACL :HH ACL: JJJ ` ` dn: abvf changetype: a objectclass: in objectclass: c objectclass: cdsUse
dn: abvf
changetype: a
objectclass: in
objectclass: c
objectclass: cdsUser
objectclass: or
objectclass: Person
objectclass: nd
objectclass: Top
ACL :HH
ACL: JJJ
`
`
dn: abvf
changetype: a
objectclass: in
objectclass: c
objectclass: cdsUser
objectclass: or
objectclass: Person
objectclass: nd
objectclass: Top
ACL :HH
ACL: JJJ
如何生成这样的文件
dn: abvf
changetype: a
objectclass: ['','','','']
ACL :['','']
`
`
dn: abvf
changetype: a
objectclass: ['','','','']
ACL :['','']
基本上我想解析这个文件,如果它多次有相同的字段,
将它的值存储在一个数组中,而不使用硬编码,因为我有许多不同的条目,比如不同的重复字段
有没有办法做到这一点,请帮助我。这是我在上面的评论中提到的一个例子。我假设新行是分隔两个不同对象的元素。最后,您将得到一个dict列表,您可以根据需要使用该列表进行打印/写入。请注意,pprint只是为了更好地打印,在写入文件时,您实际上并不需要它
import pprint
if __name__ == '__main__':
obj_list = []
pp = pprint.PrettyPrinter(indent=4)
with open('input.txt', 'r') as input_file:
temp_dict = {}
for line in input_file:
if line == '\n':
# empty dict evaluates to false
if temp_dict:
obj_list.append(temp_dict)
temp_dict = {}
else:
k, v = line.strip().split(':')
k, v = k.strip(), v.strip()
if k in temp_dict.keys():
if not isinstance(temp_dict[k], list):
old_value_as_list = [temp_dict[k]]
temp_dict[k] = old_value_as_list
temp_dict[k].append(v)
else:
temp_dict[k] = v
# since file may not end with newline
if temp_dict:
obj_list.append(temp_dict)
temp_dict = {}
pp.pprint(obj_list)
with open('output.txt', 'w') as output_file:
for obj in obj_list:
for k,v in obj.items():
output_file.write(f'{k}: {v}\n')
output_file.write('\n')
输出:
[ { 'ACL': ['HH', 'JJJ'],
'changetype': 'a',
'dn': 'abvf',
'objectclass': ['in', 'c', 'cdsUser', 'or', 'Person', 'nd', 'Top']},
{ 'ACL': ['HH', 'JJJ'],
'changetype': 'a',
'dn': 'abvf',
'objectclass': ['in', 'c', 'cdsUser', 'or', 'Person', 'nd', 'Top']}]
您可以为每个块构建字典,并使用它为每个关键字累积重复值:
with open('input.txt', 'r') as inFile:
lines = inFile.read().split("\n")
with open('ouptput.txt','w') as outFile:
block = dict()
for line in lines+[""]:
if line in ["`",""]:
outLines = [f"{k}:{[v[0],v][len(v)>1]}" for k,v in block.items()]
outFile.write("\n".join(outLines+[line])+"\n")
block = dict()
continue
keyword,value = line.split(":",1)
block.setdefault(keyword,list()).append(value.strip())
你提到没有硬编码的目的是什么?这是否意味着可能存在除“objectclass”和“ACL”之外的重复标记?或者你不知道这些字段会出现多少次,除了“objecclass”和“ACL”解析每一行并将其存储在字典中之外,还有许多这样的重复字段。如果您第二次遇到任何标记,它将出现在键列表中,而值不会是列表。然后,您可以用一系列值替换dict中的单个值,并继续追加。如何将其写入新文件i上述预期格式您可以轻松地在网上找到有关如何使用Python写入文件的教程。@MohanKumar我已根据您的问题添加了写入文件的代码。如果对您有效,请将答案标记为已接受。