[英]Read a txt-file as dict containing a numpy-array
我有很多要阅读的 .txt 文件。 .txt 文件是通过将 python 字典转换为字符串并将字符串保存在 .txt 文件中来保存的。
param_string = str(parameters-as-dict)
text_file = open(parameter_file_path, "w")
text_file.write(param_string)
text_file.close()
dict 的条目是混合类型(float、int、string、...)。 在某些文件中,dict 的一个条目是一个 numpy 数组,并保存在 txt 文件中
'epsilons': array([...])
因为我想通过名称访问保存在 dict 中的值,所以我现在想读取 txt 文件并再次将它们作为 dict 加载。 这很容易与
f = open(path, 'r')
parameters = ast.literal_eval(f.read())
只要文件中没有 numpy 数组。 当 numpy-array 存在时,我收到错误:
文件“.../python3.6/ast.py”,第 84 行,在 _convert raise ValueError('malformed node or string: ' + repr(node)) ValueError: malformed node or string: <_ast.Call object at 0x7fb5428cc630 >
这是有道理的,看看 as.literal_eval 文档( https://docs.python.org/2/library/ast.html ),它说
安全地计算包含 Python 文字或容器显示的表达式节点或 Unicode 或 Latin-1 编码字符串。 提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。
由于我不能以不同的方式重新保存文件,我不知道数组在哪个位置,我想避免繁琐的正则表达式解析,我正在寻找一种解决方案,将我的 txt 文件转换为包含 numpy 的 dict-大批。
编辑:问题不仅在于 numpy 数组,还在于当我保存一个对象时,例如特定类:
, 'foo' : <class bar>,
一个解决方案,其中所有无法解析为某种数字/布尔/某种已知数据类型的东西都会自动保存为字符串,就像它一样满足我的需求。
我建议使用迭代方法根据需要处理异常。 我不喜欢使用eval
,也许有更好的方法,但这是快速而肮脏的,并且假设您有安全的输入。
parameters = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split(':')
if val[:6] == '<class'
# string representation like '<class bar>'
# ast.literal_eval() can't handle this, and neither can eval()
# this is just a string literal, so keep it as such:
parameters[key] = val
continue
try:
parameters[key] = ast.literal_eval(val)
except ValueError as e:
# for unsupported data structures like np.array
parameters[key] = eval(val)
我想您必须逐行检查数组。 一个快速而肮脏的建议:
parameters = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split(':')
if 'array' in val:
s = val.split('(', 1)[1].split(')')[0]
parameters[key] = np.array(ast.literal_eval(s))
else:
parameters[key] = ast.literal_eval(val)
也许为了将来参考,您可以尝试使用pickle模块来保存您的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.