Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将重复字段的值放入数组中_Python - Fatal编程技术网

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我已根据您的问题添加了写入文件的代码。如果对您有效,请将答案标记为已接受。