在python中将字符串转换为元组

时间:2019-03-06 14:16:14

标签: python-3.x string numpy tuples

我有一个元组(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>

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

1 个答案:

答案 0 :(得分:0)

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

首先,ast.literal_eval()函数仅支持literalsliteral displays,而不支持numpy array(...)语法。

接下来,在元组上的str()会生成易于调试的输出;元组未实现__str__字符串转换挂钩,因此将返回其repr()表示形式。 Numpy数组确实支持str()转换,但是它们的输出仍然是一个看起来很友好的字符串,它忽略了实际值的很多细节。在您的示例中,那些... ellipsis dots表示数组的该部分中还有更多数据,但是字符串不包括那些值。因此,如果您要尝试以此重新创建阵列,则会丢失数据。

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

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

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