如何使用Python对同名数组进行分组



我在一个文本文件中有超过一千个数组类别,例如:

类别A1和类别A2:(matlab代码中的数组)

A1={[2,1,2]};
A1={[4,2,1,2,3]};
A2={[3,3,2,1]};
A2={[4,4,2,2]};
A2={[2,2,1,1,1]};

我想使用Python来帮助我读取文件并将它们分组为:

A1=[{[2,1,2]} {[4,2,1,2,3]}];  
A2=[{[3,3,2,1]} {[4,4,2,2]} {[2,2,1,1,1]}];

使用字典分组,我想你的意思是分组为字符串,因为它们不是来自.mat matlab文件的有效python容器:

from collections import OrderedDict
od = OrderedDict()
with open("infile") as f:
    for line in f:
        name, data = line.split("=")
        od.setdefault(name,[]).append(data.rstrip(";n"))
from pprint import pprint as pp
pp((od.values()))
[['{[2,1,2]}', '{[4,2,1,2,3]}'],
['{[3,3,2,1]}', '{[4,4,2,2]}', '{[2,2,1,1,1]}']]

要对文件中的数据进行分组,只需写入内容:

with open("infile", "w") as f:
    for k, v in od.items():
        f.write("{}=[{}];n".format(k, " ".join(v))))
输出:

A1=[{[2,1,2]} {[4,2,1,2,3]}];
A2=[{[3,3,2,1]} {[4,4,2,2]} {[2,2,1,1,1]}];

这实际上是您想要的输出,从每个子数组中删除分号,分组元素和分号添加到组的末尾,以保持数据在matlab文件中有效。

集合。OrderedDict将保留原始文件中的顺序,而使用普通字典将没有顺序。

更新文件时,更安全的方法是写入临时文件,然后使用NamedTemporaryFile和shutil.move:

将原始文件替换为更新后的文件。
from collections import OrderedDict
od = OrderedDict()
from tempfile import NamedTemporaryFile
from shutil import move
with open("infile") as f, NamedTemporaryFile(dir=".", delete=False) as temp:
    for line in f:
        name, data = line.split("=")
        od.setdefault(name, []).append(data.rstrip("n;"))
    for k, v in od.items():
        temp.write("{}=[{}];n".format(k, " ".join(v)))
move(temp.name, "infile")

如果代码在循环中出现错误,或者您的计算机在写入过程中崩溃,您的原始文件将被保留。

您可以首先循环您的行,然后使用=拆分您的行,然后使用ast.literal_evalstr.strip提取括号内的列表,最后使用字典与setdefault方法来获得您预期的结果:

import ast
d={}
with open('file_name') as f :
    for line in f:
        var,set_=line.split('=')
        d.setdefault(var,[]).append(ast.literal_eval(set_.strip("{}n;")))
    print d
结果:

{'A1': [[2, 1, 2], [4, 2, 1, 2, 3]], 'A2': [[3, 3, 2, 1], [4, 4, 2, 2], [2, 2, 1, 1, 1]]}

如果您希望结果与您期望的格式完全一致,您可以这样做:

d={}
with open('ex.txt') as f,open('new','w')as out:
    for line in f:
        var,set_=line.split('=')
        d.setdefault(var,[]).append(set_.strip(";n"))
    print d
    for i,j in d.items():
        out.write('{}=[{}];n'.format(i,' '.join(j)))

最后,您将在新文件中得到以下结果:

A1=[{[2,1,2]} {[4,2,1,2,3]}];
A2=[{[3,3,2,1]} {[4,4,2,2]} {[2,2,1,1,1]}];

相关内容

  • 没有找到相关文章

最新更新