Getting rid of the 'b' in front of Python strings
编辑:为了让人们省去滚动的麻烦,这个问题源于"解码"操作需要一个输出变量;我的脚本未能做到这一点。我原以为"for"循环可以就地修改变量,但事实并非如此。
长话短说,我有一些netcdf文件,从中生成一系列地图。这个脚本很好用,但是我在正确显示标题方面遇到了一些主要问题。我从netcdf文件中获取变量,它将作为我的标题(基本上是一个简单的时间戳)。首先,我尝试将其设置为python变量,然后将其用作打印标题。
不幸的是,我知道这是所谓的"字节"字符串。这意味着标题前面有一堆小写的"b"。不仅仅是一开始。IE:
B'T'B'I'B'T'B'L'B'E'
这是因为netcdf变量是一个屏蔽数组。我设法得到一些可行的代码,将数组转换成一个列表,然后再转换成一个字符串,一切看起来都可以工作。然而,整个过程的关键是"bytes.decode()"操作。
据我所知,此操作接受字节对象,然后将其作为纯字符串返回。Afaik,这些是UTF-8格式的,我检查了输入的类型,发现它们都被归为"字节"。然而,当我尝试使用decode时,它告诉我对象不是字节,字面上是在它告诉我它们是字节之后的瞬间?请参阅下面的代码和输出/错误。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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) |
输出/误差:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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"迭代来实现这个目的。当我这样做,并重新检查类型时,它仍然是字节。
代码:
1 2 3 4 5 6 7 8 | #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)) |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | (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'> |
所以我有点茫然不知该怎么处理这个问题。我不知道我是否只是不理解语义学中的一些东西,或者我发现了一个bug或者什么。
我意识到类似的问题已经被问到了,我也见过他们,并试图模仿他们的解决方案,但没有成功。这是我试过的第4或第5个程序迭代。或者解码似乎什么都不做(即:字符串仍然有b""部分),或者我得到这个错误。
如果重要的话,我想在Centos6.8上使用的是python 3.6 miniconda。
感谢您的任何帮助!如果这是微不足道的,我道歉;我不是计算机科学家。
您必须将
1 2 | for x in timeslist: fixedtimeslist.append(x.decode('utf-8')) |
我想你是说