【问题标题】:Read a txt-file as dict containing a numpy-array将 txt 文件读取为包含 numpy 数组的 dict
【发布时间】:2019-02-19 06:23:54
【问题描述】:

我有很多想要阅读的 .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()

dict 的条目是混合类型(float、int、string、...)。在某些文件中,dict 的一个条目是一个 numpy 数组,并保存在 txt 文件中

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

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

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>

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

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

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

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

 , 'foo' : <class bar>,

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

【问题讨论】:

  • 您是否检查过用于从文本文件中读取数据的 numpy 方法。那里有很多选择,这可能很容易解决您的问题。不过,我不熟悉 numpy。你也试过这个吗:docs.scipy.org/doc/numpy/reference/generated/…。这应该与 try: 和 except: 解决方案一起使用。
  • 我将编辑文件(或读取字符串)以删除“数组”字样。然后数组应该作为列表加载。
  • 另一种选择是迭代方法,try/except 捕获那些ValueError 并适当地处理它们,即paramters['epsilons']= array([1,2,3]) 应该可以工作。
  • @DavidZemens 我认为这种方法值得作为它自己的答案
  • 您希望从&lt;class bar&gt; 得到什么回报?是类的实例,还是类本身?

标签: python numpy


【解决方案1】:

我建议根据需要采用迭代方法处理异常。我不喜欢使用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)

【讨论】:

    【解决方案2】:

    我猜你必须逐行检查一个数组。一个快速而肮脏的建议:

    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 模块来保存您的数据。

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2021-08-02
      • 2017-10-05
      • 2020-09-12
      相关资源
      最近更新 更多