摆脱Python字符串前面的“ b”

时间:2018-08-09 23:36:36

标签: python string byte python-3.6 netcdf

编辑:为了省去滚动的麻烦,该问题源于需要输出变量的“ decode”操作;我的脚本无法做到这一点。我以为“ for”循环会在原位修改变量,但事实并非如此。

长话短说,我有一些netCDF文件,我将根据这些文件生成一系列地图。脚本工作正常,但是我遇到了一些重大问题,无法正确显示标题。我从netCDF文件中获得了用作我的标题的变量(基本上是一个简单的时间戳)。首先,我尝试将其设置为Python变量,然后将其用作绘图标题。

不幸的是,我了解到这就是所谓的“字节”字符串。这意味着标题前面有一堆小写的'b'。一开始不只是一个。即:

b'T'b'i'b't'b'l'b'e'

这是因为netCDF变量是一个掩码数组。我设法获得了一些可行的代码,将该数组转换为列表,然后转换为字符串,一切似乎都可以正常工作。但是,整个过程的关键是“ bytes.decode()”操作。

据我了解,此操作接收字节对象,然后将它们作为纯字符串返回。 Afaik,它们在utf-8中,我检查了输入的类型,发现它们都被归类为“字节”。 但是,当我尝试使用解码时,它告诉我对象不是字节,实际上是在告诉我它们是字节之后吗?请参阅下面的代码以及输出/错误。

代码:

#check the type, shape, and data of times
print(type(times))
print(times.shape)
print(times.data)

#change the times masked array to a list
timeslist = times.tolist(fill_value=-9999)

#check to see if elements of the list are bytes
    for x in timeslist:
    print(type(x))

#new list for decoded chars
fixedtimeslist = []

#decode the bytes list      
for x in timeslist:
    bytes.decode('utf-8')
    fixedtimeslist.append(x)   

输出/错误:

<class 'numpy.ma.core.MaskedArray'>
(19,)
[b'2' b'0' b'1' b'2' b'-' b'1' b'0' b'-' b'0' b'4' b'_' b'0' b'3' b':' b'0' b'0' b':' b'0' b'0']
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
Traceback (most recent call last):
  File "Wind10.py", line 82, in <module>
    bytes.decode('utf-8')
TypeError: descriptor 'decode' requires a 'bytes' object but received a 'str'

编辑:一些人问过,是的,我尝试在迭代之前使用“ x.decode”进行此操作。相反,当我重新检查类型时,它仍然是字节。

代码:

#decode the bytes list
for x in timeslist:
    x.decode('utf-8')
    fixedtimeslist.append(x)

#recheck to see if decode worked
for x in fixedtimeslist:
    print(type(x))

输出:

(19,)
[b'2' b'0' b'1' b'2' b'-' b'1' b'0' b'-' b'0' b'4' b'_' b'0' b'3' b':' b'0' b'0' b':' b'0' b'0']
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>

所以我有点不知所措。我不知道我是不是只是不理解语义上的内容,还是发现了错误或什么。

我意识到有人问过类似的问题,我已经看到了它们,并试图效仿他们的解决方案,但没有成功。这是我尝试过的第4或第5个程序迭代。解码似乎根本不执行任何操作(即:字符串仍然具有b''部分),或者出现此错误。

如果有关系,我认为我在CentOS 6.8上使用Python 3.6 miniconda。

任何帮助都将受到赞赏!如果这很简单,我深表歉意。我不是计算机科学家。

2 个答案:

答案 0 :(得分:1)

您必须将x解码为字节并将返回值附加到fixedtimeslist列表中。

for x in timeslist:
    fixedtimeslist.append(x.decode('utf-8'))

答案 1 :(得分:0)

我认为您的意思是x.decode('utf-8')。我对字节对象没有任何经验,但是我相信这是您想要的