编辑:为了省去滚动的麻烦,该问题源于需要输出变量的“ 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。
任何帮助都将受到赞赏!如果这很简单,我深表歉意。我不是计算机科学家。
答案 0 :(得分:1)
您必须将x
解码为字节并将返回值附加到fixedtimeslist
列表中。
for x in timeslist:
fixedtimeslist.append(x.decode('utf-8'))
答案 1 :(得分:0)
我认为您的意思是x.decode('utf-8')
。我对字节对象没有任何经验,但是我相信这是您想要的