Вставка 'NA' в виде строки в таблицу SQLite с использованием функции odo на Python

Рассмотрим следующий файл (stock_prices.csv) в формате CSV:

Symbol,Price
RY,96.61
NA,58.69
BNS,80.35

При использовании функции odo в Python для вставки CSV-файла в таблицу базы данных SQLite тикер NA представляется вставленным как значение None.

from odo import odo, dshape

input_csv = 'stock_prices.csv'
output_sqlite = 'sqlite:///stocks.db::stock_prices'
ds = dshape('var * {Symbol: string, Price: float64}')

odo(input_csv, output_sqlite, dshape=ds)

Вот код, который я использовал для запроса базы данных SQLite.

DB_PATH = 'stocks.db'
cn = sqlite3.connect(DB_PATH)
c = cn.cursor()
c.execute("SELECT * FROM stock_prices")
for row in c.fetchall():
    print(row)

Результаты были следующими:

('RY', 96.61)
(None, 58.69)
('BNS', 80.35)

Несмотря на то, что я мог бы обновить каждую строку с символом None с помощью "NA", я предпочел бы правильно вставить строку в первый раз.

Примечание: я использую функцию odo, потому что для моего реального проекта файлы, которые я буду вставлять в таблицу, имеют размер в несколько гигабайт и содержат около 15-20 столбцов. Мне показалось, что odo - это самый быстрый способ выполнить то, что мне нужно, за короткий промежуток времени.

1 ответ

Решение

Один из способов обойти это - прочитать файл, используя pandas и указав na_filter=False,

>>> import pandas as pd
>>> df = pd.read_csv('stock_prices.csv',na_filter=False)
>>> df
  Ticker  Price
0     RY  96.61
1     NA  58.69
2    BNS  80.35

И импорт:

odo(df, output_sqlite, dshape=ds)

Результаты:

>>> for row in c.fetchall():
...     print(row)
...
(u'RY', 96.61)
(u'NA', 58.69)
(u'BNS', 80.35)
Другие вопросы по тегам