将 txt 文件读取为包含 numpy 数组的字典



我有很多.txt文件想要读取。 通过将python字典转换为字符串并将字符串保存在.txt文件中来保存.txt文件。

param_string = str(parameters-as-dict)
text_file = open(parameter_file_path, "w")
text_file.write(param_string)
text_file.close()

字典的条目是混合类型(浮点数、整数、字符串,...(。在某些文件中,字典的一个条目是一个 numpy 数组,并保存在 txt 文件中

'epsilons': array([...])

因为我想按字典名称访问保存在字典中的值,所以我现在想读取 txt 文件并再次将它们作为字典加载。这很容易与

f = open(path, 'r')
parameters = ast.literal_eval(f.read())

只要文件中没有 numpy 数组。当 numpy 数组存在时,我收到错误:

文件 ".../python3.6/ast.py",第 84 行,_convert 引发 ValueError('格式错误的节点或字符串: ' + repr(node(( ValueError: 格式错误的节点或字符串: <_ast.在0x7fb5428cc630>调用对象

这是有道理的,看看as.literal_eval文档(https://docs.python.org/2/library/ast.html(,其中说

安全地评估表达式节点或 Unicode 或 Latin-1 编码 包含 Python 文本或容器显示的字符串。字符串或 提供的节点可能仅包含以下 Python 文字结构:字符串、数字、元组、列表、字典、布尔值和 没有。

由于我无法以不同的方式重新保存文件,我不知道数组位于哪个位置,并且我想避免繁琐的正则表达式解析,因此我正在寻找一种将我的 txt 文件转换为包含 numpy 数组的字典的解决方案。

编辑:问题不仅在于numpy数组,还在于我保存了例如特定类的对象时:

, 'foo' : <class bar>,

一个解决方案,其中所有无法解析为某种数字/布尔值/某些 knonw 数据类型的内容都会自动保存为字符串,就像它一样可以满足我的需求。

我建议根据需要处理异常的迭代方法。我不喜欢使用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 模块来保存您的数据。

最新更新