Как преобразовать число (строковый формат из парсинга) в число в ячейке с помощью Xlsxwriter - PullRequest
3 голосов
/ 27 мая 2020

Цель: прочитать данные о ценных бумагах из базы данных sqlite, извлечь (очистить) котировки из rnet и вставить их в таблицу Excel с помощью xlswriter

import os
import sqlite3
import xlsxwriter
from xlsxwriter.utility import xl_rowcol_to_cell
from urllib.request import urlopen
from bs4 import BeautifulSoup

def GetPrice(myurl):
    html = urlopen(myurl)
    soup = BeautifulSoup(html,'lxml')
    return soup.select_one('.h-price').text

db_filename = 'getdata.db'
db_is_new = not os.path.exists(db_filename)
conn = sqlite3.connect(db_filename)
workbook = xlsxwriter.Workbook("isin.xlsx")
worksheet = workbook.add_worksheet()

if db_is_new:
    print('Need db schema')
else:
    cur = conn.cursor()
    curr_row=0

    worksheet.write_string(0,0,'Isin')
    worksheet.write_string(0,1,'Description')
    worksheet.write_string(0,2,'Url')
    worksheet.write_string(0,3,'Price')
    money = workbook.add_format({'num_format': '$#,##0'})

    for row in cur.execute('SELECT * FROM tbIsin'):
        curr_row += 1
        worksheet.write_string(curr_row,0,row[1])
        worksheet.write_string(curr_row,1,row[3])
        worksheet.write_url(curr_row,2,row[2], string='LINK')
        oldval = GetPrice(row[2])
        newval=oldval.replace('.', '')
        worksheet.write(curr_row,3,newval)
        cella = xl_rowcol_to_cell(curr_row, 3)
        formula = '=VAL(%s)' % cella
        worksheet.write(curr_row,4,formula)

conn.close()
workbook.close() 

Моя проблема: цена в текстовом формате (пример 9963.71 с десятичным итальянским форматом), я не могу преобразовать его в числовой формат. Формула, которую я ввожу в ячейку, верна, но дает результат # ИМЯ ?.

Лучшим решением будет ввести число прямо в ячейку

Сегодня решил с двойной заменой:

oldval = GetPrice (row [2])
newval = oldval.replace ('.', '')
curval = float (newval.replace (',', '.'))

1 Ответ

0 голосов
/ 29 мая 2020

Если входные данные содержат числа в виде строк, таких как '9963.71', вы можете использовать параметр конструктора XlsxWriter strings_to_numbers, чтобы write() автоматически преобразовал их в числа:

workbook = xlsxwriter.Workbook('isin.xlsx', {'strings_to_numbers': True})

В основном в любом месте, например это сработает:

>>> float('9963.71')
9963.71

Однако, если числа содержат разделители тысяч или запятую в качестве десятичного разделителя, это не сработает, и вам нужно будет каким-то образом предварительно обработать строки.

>>> float('9,963.71')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 9,963.71
...