首页 > 解决方案 > 将具有以下结构的 csv 文件导入 SQLite

问题描述

我之前发表了一篇关于将数据导入 SQlite的帖子(将 excel 数据导入数据库 - 初学者)。

我做了一些进一步的研究,现在了解了基础知识,因此我创建了以下代码:

import sqlite3

conn = sqlite3.connect('financials.db')

cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS financials')
cur.execute('''
CREATE TABLE "financials"(
    "Mkt_Cap" REAL,
    "EV" REAL,
    "PE" REAL,
    "Yield" REAL
)
''')

fname = input('Enter the name of the csv file:')
if len(fname) < 1 : fname="data.csv"

with open(fname) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
        print(row)

以下是我的 CSV 数据当前的格式(它只是被抓取并放入 CSV 文件):

在此处输入图像描述

鉴于此,我是否能够使用以下方法提取表行的值:

Mkt_cap=row[0]
EV = row[1]

然后我会编写一个插入命令并提交以将数据放入数据库。

还是我需要重新格式化我的 CSV 数据?

标签: pythonsqlitecsvimport

解决方案


这有点棘手,因为 CSV 中的数据是转置的。通常你会让每一行定义一年,列是会计期间、资本化、ev等。

你可以自己转置数据,但我会使用pandas。假设您的 csv 根据您的屏幕截图看起来是这样的:

Valuation,,,,,,
Fiscal Period: December,2017,2018,2019,2020,2021,2022
Capitalization,270120,215323,248119,-,-
Entreprise Value (EV),262351,208330,232655,204634,200604,196917
P/E ratio,25.7x,16.0x,19.1x,67.1x,19.6x,15.3x
Yield,0.94%,1.83%,1.59%,0.83%,1.54%,1.74%

这里有一些示例代码:

import pandas as pd

df = pd.read_csv('data.csv', headers=None, na_values='-')

# first row does not mean much so let us remove it
df = df.drop(df.index[0])

# transpose the data to get it back in shape
df = df.transpose()

# use first row as header
df.columns = df.iloc[0]
# remove first row from data
df = df.drop(df.index[0])

# iterate over each row
for _, row in  df.iterrows():
    print(f'cap: {row["Capitalization"]}\t'
          f'EV: {row["Entreprise Value (EV)"]}\t'
          f'PE: {row["P/E ratio"]}\t'
          f'Yield: {row["Yield"]}')

结果:

cap: 270120 EV: 262351  PE: 25.7x   Yield: 0.94%
cap: 215323 EV: 208330  PE: 16.0x   Yield: 1.83%
cap: 248119 EV: 232655  PE: 19.1x   Yield: 1.59%
cap: 237119 EV: 204634  PE: 67.1x   Yield: 0.83%
cap: nan    EV: 200604  PE: 19.6x   Yield: 1.54%
cap: nan    EV: 196917  PE: 15.3x   Yield: 1.74%

推荐阅读