【问题标题】:how to change the data type from string to bytes, keeping the contents of the string unchanged?如何将数据类型从字符串更改为字节,保持字符串内容不变?
【发布时间】:2021-12-04 03:22:50
【问题描述】:

如何将字符串转换为字节?而且这不是解码/编码,我只是字符串中的字节,我只需要将字符串的格式转换为字节。

关键是我想在图像元数据中写入数组numpy。为了保存数组的形状及其内容,我使用了 pickle 包,但在图像元数据中只能写入一个字符串,所以我通过简单的 srt() 将 pickle 对象转换为字符串。从图像元数据中写入和读取的此类数据看起来与位相同,但采用字符串格式: b'\x80\x04\x95\xaa\x00\x00\x00... 现在,为了让 pickle 能够将此数据转换为 numpy 数组,我需要将其返回为类型(字节),但我该怎么做呢?互联网上的每个人都在谈论通过解码/编码将字符串转换为字节,反之亦然,但这不是我需要的

【问题讨论】:

    标签: numpy pickle


    【解决方案1】:

    如果能显示一些代码就好了。

    pickle.dumps 返回一个bytes 对象;理想情况下,您可以在没有str 的情况下将其直接写入图像元数据;调查您是否可以在“二进制”模式下编写元数据。如果这不是一个选项,我建议查看base64 编码。

    如果您坚持使用str 方法,您可以使用ast.literal_eval 稍微安全地转换回字节对象。

    此示例演示二进制和strast.literal_eval

    import ast
    import pickle
    
    import numpy as np
    
    a = np.array([[1.23, np.pi], [3, 4]])
    
    # binary mode
    with open('data.bin', 'wb') as outfile:
        outfile.write(pickle.dumps(a))
    
    with open('data.bin', 'rb') as infile:
        b = pickle.loads(infile.read())
    
    print('binary')
    print(b)
    print(f'{(a==b).all() = }')
    
    # ast.literal_eval hack
    with open('data.txt', 'w') as outfile:
        outfile.write(str(pickle.dumps(a)))
    
    with open('data.txt') as infile:
        c = pickle.loads(ast.literal_eval(infile.read()))
    
    print()
    print('str & ast.literal_eval')
    print(c)
    print(f'{(c==b).all() = }')
    

    在我的系统上(Ubuntu 20.04,Python 3.9.7 通过 Conda),这给出了:

    binary
    [[1.23       3.14159265]
     [3.         4.        ]]
    (a==b).all() = True
    
    str & ast.literal_eval
    [[1.23       3.14159265]
     [3.         4.        ]]
    (c==b).all() = True
    

    【讨论】:

    • 非常感谢,ast 选项有效。不幸的是,只能将字符串写入元数据,如果可以写入字节,那就没有问题了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多