在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
。另请参见Unixstrings
实用程序。这不是问题这是带有空格的字符,这是因为终端不打印那些不可打印的字符(是的,它确实打印了,只是看起来一点也不像),而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'