在Python中将字节转换为字符串时出现问题

在Python中将字节转换为字符串时出现问题,python,string,ascii,Python,String,Ascii,我有一个名为**.bxl的文件,我尝试用Python阅读该文件,如下所示: import chardet bxl_file = open(bxl_filename,'rb') bxl_str = bxl_file.readlines()[0] the_encoding = chardet.detect(bxl_str)['encoding'] bxl_str = bxl_str.decode(the_encoding) bxl_file.close() 当我打印bxl\u str时,它看起来像

我有一个名为
**.bxl
的文件,我尝试用Python阅读该文件,如下所示:

import chardet
bxl_file = open(bxl_filename,'rb')
bxl_str = bxl_file.readlines()[0]
the_encoding = chardet.detect(bxl_str)['encoding']
bxl_str = bxl_str.decode(the_encoding)
bxl_file.close()
当我打印
bxl\u str
时,它看起来像这样: 但是,如果我直接将其显示为:

我想要的是得到一个字符串,就像
打印(bxl\u str)
结果一样。有谁能帮我吗?谢谢!!

您所经历的行为是这样一个事实的结果:当您将变量插入解释器时,它会显示它的repr属性,而print()则采用str(在本场景中相同),并忽略所有不可打印的字符,例如:\x00、\x01,并用其他字符替换它们(我猜是空白)

如果您不关心间距,可选择以下解决方案:

''.join(x for x in bxl_str if x.isprintable())
或者,如果您确实关心间距:

spaced_str = ''
for char in bxl_str:
    if char.isprintable():
        spaced_str += char
    else:
        spaced_str += ' '
或者以一种更为通灵的方式(谢谢你,丹):


tripleee在评论中所说的话成立,但这只是一个猜测

它看起来像某种“数据字典”,即为不透明/数字值提供描述性名称。似乎存在某种类型的分段,不同的值集之间有37到44个
NUL
字符。每组值似乎都有键/值对,也由
NUL
字符分隔,我将使用以下代码来解释此文件:

import re

with open('Links.bxl', encoding='ascii') as fd:
    buf = fd.read()

for section in re.split('\x00{32,}', buf):
    print('Next Section')
    section = section.split('\x00')
    for i in range(1, len(section), 2):
        print(' {0!r} => {1!r}'.format(section[i-1], section[i]))
    if len(section) % 2 == 1:
        print(repr(section[-1]))
上述输出的前几行是:

Next Section
'\x01'
Next Section
'Class'
Next Section
 '0' => 'Undefined'
 '11' => 'Freeway'
 '21' => 'Expressway'
 '31' => 'Major Arterial'
 '41' => 'Minor Arterial'
 '51' => 'Local Street'
 '61' => 'Access Road'
 '81' => 'Ramp'
 '82' => 'UnderRoad'
 '83' => 'TAZ_Link'
 '84' => 'Interchange_Ramp'
 '85' => 'UnderLine'
 '' => 'Disabled_AB'
Next Section
 '0' => 'No'
 '1' => 'Yes'
 '' => 'Disabled_BA'

您在这里遇到了问题-bxl_file.readlines()[0],但您希望您的字符串看起来像-bxl_str.decode(_编码)@PySaad很抱歉,我不明白你的意思?PLST看起来可能是一种固定长度的二进制格式。也就是说,它不能直接作为纯文本读取,但应该进行某种程度的解析。@deceze我已经在描述中添加了该文件。你能看一下吗?谢谢。不知道该文件的用途,我认为除了“这不是编码,你做错了”之外,没有人能告诉你更多的事情。系统上的
print
可能不会为控制字符生成任何可见的输出;您可以在Python中使用类似于拆分控制字符的方法来近似这一点,并假设提取的片段可以简单地解码为
ascii
。另请参见Unix
strings
实用程序。这不是问题这是带有空格的字符,这是因为终端不打印那些不可打印的字符(是的,它确实打印了,只是看起来一点也不像),而repr显式地可视化不可打印的字符。关于
map
,没有什么pythonic。而是使用理解:
'.join(char if char.isprintable()bxl_str中字符的else'')
Next Section
'\x01'
Next Section
'Class'
Next Section
 '0' => 'Undefined'
 '11' => 'Freeway'
 '21' => 'Expressway'
 '31' => 'Major Arterial'
 '41' => 'Minor Arterial'
 '51' => 'Local Street'
 '61' => 'Access Road'
 '81' => 'Ramp'
 '82' => 'UnderRoad'
 '83' => 'TAZ_Link'
 '84' => 'Interchange_Ramp'
 '85' => 'UnderLine'
 '' => 'Disabled_AB'
Next Section
 '0' => 'No'
 '1' => 'Yes'
 '' => 'Disabled_BA'