TypeError:不支持的操作数类型--float和NoneType--使用Python和DocX

TypeError:不支持的操作数类型--float和NoneType--使用Python和DocX,python,excel,docx,Python,Excel,Docx,创建了一个使用python从excel文件读取数据的小程序,利用DocX从数据生成word文档。我的代码大部分时间都在工作,但有时会出现以下错误: TypeError: unsupported operand type(s) for +: 'float' and 'NoneType' 它在这里引用这一行: stock_sum = sum(stock_data['total'] for stock_data in stockData.values()) 我一辈子都搞不明白为什么会产生这样的错误

创建了一个使用python从excel文件读取数据的小程序,利用DocX从数据生成word文档。我的代码大部分时间都在工作,但有时会出现以下错误:

TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'
它在这里引用这一行:

stock_sum = sum(stock_data['total'] for stock_data in stockData.values())
我一辈子都搞不明白为什么会产生这样的错误。我仔细检查了excel中的数据,这些值都是没有文本的数字

下面是代码开头的详细说明:

import urllib.request
from docx import Document
from docx.shared import Inches
import openpyxl, pprint, math, datetime
from collections import OrderedDict
print('Opening workbook...')
wb = openpyxl.load_workbook('stocks.xlsx')
sheet = wb.get_sheet_by_name('stock_list')
sheet2 = wb.get_sheet_by_name('sp500')
ei = wb.get_sheet_by_name('ei')
garp = wb.get_sheet_by_name('garp')
spmktcap = wb.get_sheet_by_name('spmktcap')
stockData = {}


number_stocks = 0

client_name = input("What is client's name?: " )
analyst_name = input("What is your name?: ")
analyst_email = input("What is your email?: ")
analyst_extension = input("What is your extension?:")


#assign values from stock list to stockData dictionary
for row in range(2, sheet.max_row + 1):
    # Each row in the spreadsheet has data for one census tract.
    ticker = sheet['A' + str(row)].value
    shares = sheet['B' + str(row)].value
    company_name = sheet['C' + str(row)].value
    sector = sheet['D' + str(row)].value
    price = sheet['E' + str(row)].value
    total = sheet['F' + str(row)].value
    beta = sheet['G' + str(row)].value
    dividend = sheet['H' + str(row)].value
    mktcap = sheet['I' + str(row)].value
    number_stocks+=1

    # Make sure the key for this ticker exists.
    stockData.setdefault(ticker,{})
    stockData[ticker]['company_name'] = company_name
    stockData[ticker]['sector'] = sector
    stockData[ticker]['shares'] = shares
    stockData[ticker]['price'] = price
    stockData[ticker]['total'] = total
    stockData[ticker]['dividend'] = dividend
    stockData[ticker]['beta'] = beta
    stockData[ticker]['mktcap'] = mktcap


#get total portfolio value
stock_sum = sum(stock_data['total'] for stock_data in stockData.values())

#add percentages for each stock to dictionary
for stock_data in stockData.values():
    stock_data['percentage'] = stock_data['total']/stock_sum

portfolio_beta = sum(stock['beta']*stock['percentage'] for stock in stockData.values())

portfolio_yield = sum(stock['dividend']*stock['percentage'] for stock in stockData.values())
portfolio_yield = portfolio_yield/100
# print(portfolio_beta)

market_cap = sum(stock['mktcap']*stock['percentage'] for stock in stockData.values())
mkt_cap_bill = market_cap/1000

您需要处理数据以查找
None
,这些数据可能来自空白单元格或工作表中的计算错误

在短期内,替换以下内容:

stock_sum = sum(stock_data['total'] for stock_data in stockData.values())
为此:

stock_sum = sum(0 if stock_data['total'] is None else stock_data['total'] for stock_data in stockData.values())

Excel表格末尾是否有空白值?您需要查看相关数据。更重要的是,您可能应该预处理这些值,将
None
替换为
0
NaN
,视情况而定。(也许这真的是一个错误…)好吧,我把括号合上了。没有帮助。我删除了excel中的整个列,并将其替换。没有帮助。但是我确实用python打印了数据,对于“total”字段,它在python中显示为一个公式('=e7*b7')——这让我完全困惑。这些值是从使用此公式的另一张表中粘贴的,但作为值粘贴。在这个领域里没有公式!所以…我想我明白了。当我在python中查看数据时,有一个条目被记录为“None”值——因此,当我删除所有较低的行时,我认为这一定是excel中某个地方的空行。好奇的是,有没有人知道一个简单的实现来确保额外的行不会意外地添加到excel中?这个程序将由一些用户共享,我认为这在将来会成为一个问题。@JohnRogerson:您是否研究过将数据放入数据库而不是Excel?当我更改此项时--错误现在是:stock_data['percentage']=stock_data['total']/stock_sum type错误:不支持的操作数类型对于/:“非类型”和“浮动”