python去掉第一个字符_去掉python字符串前面的”b”

本问题已经有最佳答案,请猛点这里访问。

编辑:为了让人们省去滚动的麻烦,这个问题源于"解码"操作需要一个输出变量;我的脚本未能做到这一点。我原以为"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

(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']

Traceback (most recent call last):

File"Wind10.py", line 82, in

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']

所以我有点茫然不知该怎么处理这个问题。我不知道我是否只是不理解语义学中的一些东西,或者我发现了一个bug或者什么。

我意识到类似的问题已经被问到了,我也见过他们,并试图模仿他们的解决方案,但没有成功。这是我试过的第4或第5个程序迭代。或者解码似乎什么都不做(即:字符串仍然有b""部分),或者我得到这个错误。

如果重要的话,我想在Centos6.8上使用的是python 3.6 miniconda。

感谢您的任何帮助!如果这是微不足道的,我道歉;我不是计算机科学家。

你好像有错别字,难道bytes.decode('utf-8')不是x = x.decode('utf-8')吗?您试图对列表中的每个元素进行解码,并将其结果附加到列表中,对吗?

我也试过了,好像什么都没做。没有错误,在重新检查类型时,它仍然说它们是字节。

从字节解码返回字符串。返回。你必须把它放入变量中。decodig不修改初始变量。在代码中,您将初始变量放入列表中,当然,列表中只包含字节。

把这段代码bytes.decode('utf-8')改成x = x.decode('utf-8')(听起来你根本没试过)。正如@dgan所暗示的,您需要实际对解码字节串的结果做些什么。x.decode("utf-8")只创建一个被抛出的未命名变量。同样,把这条线bytes.decode('utf-8')改为x = x.decode('utf-8')。你好像根本没试过。

等等,当我有for循环时,我想:"for x in timeslist:x.decode('utf-8')fixed timeslist.append(x)"我在附加"fixed"值?

试过了,就成功了。我明白了,所以我只能把解码的过程藏在某个地方。我以为它会按照外观的顺序,通过"for"循环工作,正如你说的,"修改"x。我想它不会。正如我想的,它是一些微不足道的东西。谢谢!给你们的电子饼干。

bytes.decode不修改任何地方的内容。通过将另一个名称绑定到同一个变量,运行相关的方法/函数/运算符,然后比较这两个变量,可以检查方法/函数/运算符是否执行了就地操作。例如:不到位:a = b = [1,2,3]; a = a + [4]; assert not (a is b);到位:a = b = [1, 2, 3]; a += [4]; assert a is b(+操作符不到位,`+=in到位)。

我想我理解。在第一个例子中,仅仅因为a=b=[1,2,3]是第一个,并不意味着后面的加法也适用于b;您必须明确地告诉它这样做吗?

是的,对于不在适当的对象上执行的操作/函数/方法,您需要将它们的结果重新绑定到变量以使用该结果。对于执行到位的操作,它们不返回任何内容,因此它们将直接"通过"或"修改"对象。bytes.decode不就地执行,返回一个新对象。

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

1

2for x in timeslist:

fixedtimeslist.append(x.decode('utf-8'))

这与上面其他人的建议类似。我原以为它会简单地通过"for"循环,改变x,但我想情况并非如此。谢谢你抽出时间。

我想你是说x.decode('utf-8')。我对bytes对象没有任何经验,但我相信这是你想要的

我也试过了,好像什么都没做。没有错误,在重新检查类型时,它仍然说它们是字节。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值