繁体   English   中英

将 txt 文件作为包含 numpy 数组的 dict 读取

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM