使用 dict 进行分组,我认为您的意思是分组为字符串,因为它们不是来自 .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 文件中有效。
collections.OrderedDict 将保留原始文件中的顺序,而使用普通 dict 将没有顺序。
更新文件时更安全的方法是写入临时文件,然后使用 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")
如果代码在循环中出错或您的程序在写入过程中崩溃,您的原始文件将被保留。