Python 3 错误地将“0x0000”字符串转换为十六进制

问题描述

我正在从数据库提取数据,其中一列始终具有以“0x”开头的十六进制数据。最终目标是简单地将该表中的所有数据写入另一个系统读取的管道分隔文件中。自然,这会触发 Python 认为它是一个十六进制值并尝试对其进行转换。这是我的代码片段。

for row in cur.execute(sql):
    for x in range(len(row)):
                    
                    if(str(row[x]) is None or str(row[x])=='None'):
                        row[x]=""
                    if(len(row)-1==x):
                       
                        f.write(str(row[x]))
                    else:
                        f.write(str(row[x])+"|")

row[x] 可以是整数、字符串、日期时间等。 str() 将其转换为字符串,但是当它遇到包含“0x0000”的单元格时,它会将十六进制转换为 b'\x00\ x00'。我希望该值仅显示“0x0000”。数据以 varbinary 的形式存储在数据库中。

解决方法

看起来好像值可能是 bytes 实例,在这种情况下,您可以通过调用它的 hex 方法将其转换为十六进制数字的字符串,并在结果前加上 '0x' 到获取您想要的字符串表示。

bs = b'\x00\x00'
s = '0x' + bs.hex()  # '0x0000'

您的代码将如下所示:

for row in cur.execute(sql):
    for x in range(len(row)):
                    
        if(str(row[x]) is None or str(row[x])=='None'):
            row[x]=""

        elif isinstance(row[x],bytes):
            row[x] = '0x' + row[x].hex()

        if(len(row)-1==x):       
            f.write(str(row[x]))
        else:
            f.write(str(row[x])+"|")