Erstellt ein kleines Programm mit Python zum Lesen von Daten aus einer Excel-Datei mit DocX, um ein Word-Dokument aus den Daten zu generieren. Mein Code wurde zum größten Teil arbeiten, aber gelegentlich hält diese Fehler:TypeError: Nicht unterstützte Operandentyp - float und NoneType - Verwendung von Python und DocX
TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'
Es verweist auf diese Zeile hier:
stock_sum = sum(stock_data['total'] for stock_data in stockData.values())
Ich kann nicht für das Leben von mir herauszufinden, warum Es erzeugt diesen Fehler. Ich habe die Daten in Excel überprüft und die Werte in Frage sind alle Zahlen ohne Text.
Hier ist ein genauerer Blick auf den Anfang des Codes:
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
Könnte es am Ende der Excel-Sheets leere Werte sein? – bernie
Sie müssen sich die fraglichen Daten ansehen. Noch wichtiger ist, dass Sie die Werte wahrscheinlich vorverarbeiten sollten, indem Sie "None" durch "0" oder "NaN" ersetzen. (Vielleicht ist es wirklich ein Fehler ...) –
Ok, also habe ich die Klammern geschlossen. Hat nicht geholfen. Ich löschte die gesamte Spalte in Excel und ersetzte sie. Hat nicht geholfen. ABER also habe ich die Daten in Python ausgedruckt und für das 'total'-Feld erscheint es in Python als Formel (' = e7 * b7 ') - was mich total verblüfft. Die Werte werden aus einem anderen Blatt eingefügt, das diese Formel verwendet - sie werden jedoch als Werte eingefügt. Und es gibt keine Formel in diesem Bereich! –