【问题标题】:getting rid of " " from slicing in python从 python 中的切片中摆脱“”
【发布时间】:2014-08-24 18:23:43
【问题描述】:

我正在使用以下程序将两个以 hex,hex# 格式编写的十六进制字符串转换为整数。

程序:

a=raw_input("Serial Command: ")
    if a=="q":
        break
    ser.write(a)
    time.sleep(1)
    b=ser.readline()
    print "b=",b
    azt=b[:8]
    alt=b[9:17]
    print "azt=",azt,"|","alt=",alt
    print int(azt)," ",int(alt)

输出和跟踪:

Serial Command: z
b= 07A49B00,0006EF00#
azt= 07A49B00 | alt= 0006EF00
Traceback (most recent call last):
  File "C:\Users\Jeff\Desktop\celestronserial.py", line 58, in <module>
    print int(azt)
ValueError: invalid literal for int() with base 10: '07A49B00'

int(azt/alt) 函数返回一个错误,指出它不是以 10 为底的。从“alt/azt=”行的输出中可以看到,罪魁祸首是一些空白。谁能告诉我为什么我要拆分这个空白表格?我该如何摆脱它?我试过 replace(" ","") 无济于事。

【问题讨论】:

  • 我认为引用的代码来自循环内部,因为循环外部break 是语法错误。
  • 到底是什么让你觉得罪魁祸首......是一些空白。"?你正在尝试转换一个表示(大概)base-16数字的字符串,但作为一个表示以 10 为底的数字的字符串,这是行不通的。阅读the docs on int

标签: python string int hex


【解决方案1】:

该空间仅由print 插入。

In [1]: print "hello","world"
hello world

您的变量没有被编辑。要查看变量中的实际内容,请不要在 print 中使用逗号。

In [2]: print "hello" + "world"
helloworld

至于你的整数转换,一定要列出基数:

int(azt, base=16)

【讨论】:

  • 谢谢你,我觉得自己很愚蠢,我实际上是在两天前凌晨 1 点遇到这个问题并想通了。不知道为什么我这次没有抓住它。我想这会告诉你,你并不总是早上最敏锐。
【解决方案2】:

您认为需要消除的空格来自打印语句,而不是数据的一部分。你真正需要的是int(azt, 16)。如果基数不是 10,则需要提供基数。

【讨论】:

    【解决方案3】:

    您对空格的假设可能不正确,因为print 语句会自动在它打印的参数之间引入一个空格。

    要得到你想要的字符串,使用

    s = "07A49B00,0006EF00#"
    azt, alt = b[:-1].split(",")
    

    [:-1] 省略了结尾的#,然后.split() 调用返回逗号周围的字符串列表。应该只有两个,所以我使用解包分配将值放入单个变量中。

    真正的问题是您的int() 调用,它大概应该指定16 为基数以实现必要的十六进制转换(例如,int(azt, 16))。

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2010-10-01
      • 2018-10-17
      • 2017-05-28
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2013-12-22
      相关资源
      最近更新 更多