【问题标题】:Convert str to float explicitly in Python 3在 Python 3 中将 str 显式转换为浮点数
【发布时间】:2016-02-24 10:23:39
【问题描述】:

我得到一个“TypeError: Can't convert 'float' object to str implicitly”错误,因为我试图将浮点数除以字符串。

我正在尝试将字符串转换为浮点数,但仍然出现错误。

字符串 'empNumber' 是所有数字,但有一个逗号(例如:112,000) - 因此使用“替换”函数来去除逗号。当我尝试划分“最终/小数”时出现错误。如何解决此类型错误?

def revPerEmployee():
    for ticker in sp500short:
        searchurl = "http://finance.yahoo.com/q/ks?s="+ticker
        f = urlopen(searchurl)
        html = f.read()
        soup = BeautifulSoup(html, "html.parser")

        searchurlemp = "http://finance.yahoo.com/q/pr?s="+ticker+"+Profile"
        femp = urlopen(searchurlemp)
        htmlemp = femp.read()
        soupemp = BeautifulSoup(htmlemp, "html.parser")

        try:
            revenue2 = soup.find("td", text="Revenue (ttm):").find_next_sibling("td").text
            empCount2 = soupemp.find("td", text="Full Time Employees:").find_next_sibling("td").text 

        except:
            revenue2 = "There is no data for this company"
            empCount2 = "There is no data for this company"         

        if revenue2 == "There is no data for this company" or empCount2 == "There is no data for this company":
            lastLetter = ticker+": There is no data for this company"
        else:
            lastLetter = revenue2[len(revenue2)-1:len(revenue2)]
            empNumber = empCount2.replace(",", "")
            decimal = float(empNumber)

        if lastLetter == "B":
            result = revenue2[:-1]
            revNum = float(result)
            final = revNum * 1000000000.0
            revPerEmp = final/decimal
            print(ticker+": "+revPerEmp)

        elif lastLetter == "M":
            result = revenue2[:-1]
            revNum = float(result)
            final = revNum * 1000000.0
            #newnum = "{:0,.2f}".format(final)
            revPerEmp = final/decimal
            print(ticker+": "+revPerEmp)

        elif lastLetter == "K":
            result = revenue2[:-1]
            revNum = float(result)
            final = revNum * 1000.0
            #newnum = "{:0,.2f}".format(final)
            revPerEmp = final/decimal
            print(ticker+": "+revPerEmp)

        else:
            print(lastLetter)

【问题讨论】:

  • 这里有很多不相关的代码;您应该将示例剥离到相关位,并确保它是正确的。您的示例中没有变量 empNumber2 。没有迹象表明错误在哪里。当您将字符串转换为浮点数时,您甚至不会提及您现在遇到的错误。阅读更多关于SSCCE
  • 我确实说过我在哪里画了一个错误。错误发生在“revPerEmp = final/decimal”的第一次出现。错误说,“TypeError:无法将'float'对象隐式转换为str”
  • 还是后面的那一行? print(ticker+": "+revPerEmp)
  • 正如 Octavian 所说,您收到您所说的错误的可能性为零。
  • @Obsidian 是的,我的 IDE 在网上说 print(ticker+": "+revPerEmp).您注意到什么问题?

标签: python casting typeerror


【解决方案1】:

17 + "orange"是废话,不能加数字和字符串。你想要的

print("%s: %s" % (ticker, revPerEmp))

(您可以将%s切换为其他格式,例如%.2f),或

print(str(ticker) + ": " + str(revPerEmp))

【讨论】:

  • 工作就像一个魅力。对不起我的无知
  • 无知没问题,这就是该网站的用途。只是想让你意识到你的问题写得越好,你得到答案的机会就会增加。以正确的方式提出正确的问题,更有可能得到快速的回答。您可能还想仔细阅读 Stack Overflow help on asking
【解决方案2】:

问题在于您的程序假定从 URL 请求中获取的是一个数字形式的数字,后跟一个后缀(K、M 或 B)。这未经测试。

还有两条建议可以改进您的代码。首先,您确实使用了 try ... except 子句来检查何时无法获取数据。如果转换失败,您也可以使用它。可以在 except 子句中打印消息“该公司没有数据”。

其次,你有三个非常相似的 if 子句,这表明它们可以被压缩。后缀值可以使用 python 字典。

SUFFIX_VALUES = { 'K': 1000.0, 'M': 1000000.0, 'B': 1000000000.0 }
try:
  # taken from your code
  revenue2 = soup.find("td", text="Revenue(ttm):").find_next_sibling("td").text
  empCount2 = soupemp.find("td", text="Full Time Employees:").find_next_sibling("td").text 
  revNum = float(revenue2[:-1])
  empNumber = empCount2.replace(",", "")
  decimal = float(empNumber)
  lastLetter = revenue2[-1]
  final = revNum * SUFFIX_VALUES[lastLetter]
  revPerEmp = final/decimal
  print("%s: %d" % (ticker, revPerEmp))
except:
  print(ticker + ": There is no data for this company")

现在,如果 URL 请求中缺少数据、转换失败或后缀错误,程序将执行 except 子句。

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多