【问题标题】:conversion of string to tuple in python在python中将字符串转换为元组
【发布时间】:2019-07-28 05:48:22
【问题描述】:

我有一个元组(h)如下:

(array([[145,  34,  26,  18,  90,  89],
   [ 86, 141, 216, 167,  67, 214],
   [ 18,   0, 212,  49, 232,  34],
   ...,
   [147,  99,  73, 110, 108,   9],
   [222, 133, 231,  48, 227, 154],
   [184, 133, 169, 201, 162, 168]], dtype=uint8), array([[178,  58,  24,  90],
   [  3,  31, 129, 243],
   [ 48,  92,  19, 108],
   ...,
   [148,  21,  25, 209],
   [189, 114,  46, 218],
   [ 15,  43,  92,  61]], dtype=uint8), array([[ 17, 254, 216, ..., 126,  74, 129],
   [231, 168, 214, ..., 131,  50, 107],
   [ 77, 185, 229, ...,  86, 167,  61],
   ...,
   [105, 240,  95, ..., 230, 158,  27],
   [211,  46, 193, ...,  48,  57,  79],
   [136, 126, 235, ..., 109,  33, 185]], dtype=uint8))

我把它转换成字符串 s = str(h):

'(array([[  1,  60, 249, 162,  51,   3],\n       [ 57,  76, 193, 244,  17, 238],\n       [ 22,  72, 101, 229, 185, 124],\n       ...,\n       [132, 243, 123, 192, 152, 107],\n       [163, 187, 131,  47, 253, 155],\n       [ 21,   3,  77, 208, 229,  15]], dtype=uint8), array([[119, 149, 215, 129],\n       [146,  71, 121,  79],\n       [114, 148, 121, 140],\n       ...,\n       [175, 121,  81,  71],\n       [178,  92,   1,  99],\n       [ 80, 122, 189, 209]], dtype=uint8), array([[ 26, 122, 248, ..., 104, 167,  29],\n       [ 41, 213, 250, ...,  82,  71, 211],\n       [ 20, 122,   4, ..., 152,  99, 121],\n       ...,\n       [133,  77,  84, ..., 238, 243, 240],\n       [208, 183, 187, ..., 182,  51, 116],\n       [ 19, 135,  48, ..., 210, 163,  58]], dtype=uint8))'

现在,我想将 s 转换回元组。我尝试使用 ast.literal_eval(s),但出现以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ast.py", line 84, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python3.5/ast.py", line 55, in _convert
return tuple(map(_convert, node.elts))
File "/usr/lib/python3.5/ast.py", line 83, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x76a6f770>

我在任何地方都找不到这个确切的解决方案。如果有人可以帮助我,那就太好了。

【问题讨论】:

  • 为什么您要将带有 numpy 数组的元组转换为字符串?你这样做是为了解决什么更高层次的问题?
  • 不,ast.literal_eval() 非常有限,速度很慢,并且仅对 Python 内置类型的子集有用。无论如何,它不应被视为生产级工具。
  • 我想将此元组存储在数据库中,我觉得将其转换为字符串然后存储会更简单。请建议您是否有更好的方法?
  • 如果要将其存储为不透明的数据块,只需使用pickle 模块。

标签: python-3.x string numpy tuples


【解决方案1】:

您不能在 numpy 数组(以元组或其他方式包装)上使用 str() 并希望恢复数据。

首先ast.literal_eval()函数只支持literalsliteral displays,不支持numpyarray(...)语法。

接下来,元组上的str() 产生调试友好的输出;元组没有实现__str__ 字符串转换钩子,因此返回它们的repr() 表示。 Numpy 数组确实支持str() 转换,但它们的输出仍然只是一个看起来很友好的字符串,它从实际值中省略了很多细节。在您的示例中,那些... ellipsis dots 表示数组的该部分中有更多数据,但字符串不包含这些值。因此,如果您尝试从中重新创建数组,则会丢失数据。

如果您需要将这些元组存储在文件或数据库列中,或者需要通过网络连接传输它们,则需要序列化数据。正确的序列化将保留数组的每个细节。

对于具有 numpy 数组的元组,您可以使用 pickle.dumps() 生成一个 bytes 对象,该对象可以传回 pickles.loads() 以重新创建相同的值。

您还可以将单个 numpy 数组转换为特定于 numpy 的二进制格式,然后使用 numpy.save() and numpy.load() functions(直接对文件进行操作,但您可以传入 io.BytesIO() objects)再次加载该格式。

【讨论】:

  • 非常感谢您的帮助。我使用了 numpy.save() 和 numpy.load() 并且成功了。
  • 很高兴能帮上忙!如果您觉得它对您有用,请随时 accept my answer。 :-)
猜你喜欢
  • 2013-11-07
  • 2021-05-30
  • 1970-01-01
  • 2012-03-15
  • 2023-01-10
  • 2022-07-24
  • 1970-01-01
相关资源
最近更新 更多