我在一个文本文件中有超过一千个数组类别,例如:
类别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_eval
和str.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]}];