簡體   English   中英

Python:從文件 csv 加載數據在.db 中插入整個數據並對表進行操作

[英]Python: loading data from file csv insert whole data in .db and operate on tables

我目前正在學習 python 語言。 這是我的問題,我將 .txt 文件轉換為 .csv 然后想將表插入到數據庫文件中。 我對底部即時粘貼結果的迭代有問題。 我該如何迭代它? 這幾天我很掙扎,所以真的不知道如何解決這個問題。

txt 文件(幾行):

id,id2,album,artysta
TRMMMYQ128F932D901,SOQMMHC12AB0180CB8,Faster Pussy cat,Silent Night
TRMMMKD128F425225D,SOVFVAK12A8C1350D9,Karkkiautomaatti,Tanssi vaan
TRMMMRX128F93187D9,SOGTUKN12AB017F4F1,Hudson Mohawke,No One Could Ever
TRMMMCH128F425532C,SOBNYVR12A8C13558C,Yerba Brava,Si Vos Querés
TRMMMWA128F426B589,SOHSBXH12A8C13B0DF,Der Mystic,Tangle Of Aspens
TRMMMXN128F42936A5,SOZVAPQ12A8C13B63C,David Montgomery,"Symphony No. 1 G minor ""Sinfonie Serieuse""/Allegro con energia"
TRMMMLR128F1494097,SOQVRHI12A6D4FB2D7,Sasha / Turbulence,We Have Got Love
TRMMMBB12903CB7D21,SOEYRFT12AB018936C,Kris Kross,2 Da Beat Ch'yall

Python:

from io import StringIO
import pandas as pd
import numpy as np
import os
import sqlite3, csv

save_path = r"C:\Users\Maticz\Desktop\python"
#konwerter txt -> csv
in_file = os.path.join(save_path, "tracks.txt")
out_file = os.path.join(save_path, "Output.csv")
#df = pd.read_csv(in_file, sep="<SEP>", engine='python')
#df.to_csv(out_file, index=False)
#print(df)

df = pd.read_csv(r'C:\Users\Maticz\PycharmProjects\zadanie\tracks.txt', delimiter='<SEP>',
                 engine='python', names=["id", "id2", "album", "artysta"])
print(df.head(5))
sv = df.to_csv(r'C:\Users\Maticz\PycharmProjects\zadanie\tracks.csv', index = None, header=True)
con = sqlite3.connect("artists.db")
cur = con.cursor()

cur.execute("CREATE TABLE IF NOT EXISTS tabela (id TEXT, id2 TEXT, album TEXT, artysta TEXT);")

with open(r'C:\Users\Maticz\PycharmProjects\zadanie\tracks.csv', 'a+') as fin:
    dr = pd.read_csv(fin, delimiter=',', names=["id", "id2", "album", "artysta"]) # comma is default delimiter
    to_db = [(i['id'], i['id2'], i['album'], i['artysta']) for i in dr]
    cur.executemany("INSERT INTO tabela (id, id2, album, artysta) VALUES (?, ?, ?, ?);", to_db)
con.commit()
cur.execute("SELECT * FROM artists")
print(cur.fetchall())
con.close()

Output:

                   id                 id2             album            artysta
0  TRMMMYQ128F932D901  SOQMMHC12AB0180CB8  Faster Pussy cat       Silent Night
1  TRMMMKD128F425225D  SOVFVAK12A8C1350D9  Karkkiautomaatti        Tanssi vaan
2  TRMMMRX128F93187D9  SOGTUKN12AB017F4F1    Hudson Mohawke  No One Could Ever
3  TRMMMCH128F425532C  SOBNYVR12A8C13558C       Yerba Brava      Si Vos Querés
4  TRMMMWA128F426B589  SOHSBXH12A8C13B0DF        Der Mystic   Tangle Of Aspens
Traceback (most recent call last):
  File "C:/Users/Maticz/PycharmProjects/zadanie/main.py", line 26, in <module>
    to_db = [(i['id'], i['id2'], i['album'], i['artysta']) for i in dr]
  File "C:/Users/Maticz/PycharmProjects/zadanie/main.py", line 26, in <listcomp>
    to_db = [(i['id'], i['id2'], i['album'], i['artysta']) for i in dr]
TypeError: string indices must be integers

Process finished with exit code 1

感謝您的幫助謝謝:)

您可以使用 sqlalchemy 簡化操作

from sqlalchemy import create_engine
# sqlite://<nohostname>/<path>
# where <path> is relative:
engine = create_engine('sqlite:///artists.db')
df.to_sql('tabela', con = engine, if_exists = 'append', chunksize=1000)

這將消除寫入另一個 CSV 的需要,因為您已經在 pandas dataframe 中擁有數據。 完成此操作后,您可以創建 cursor 以驗證數據是否已寫入 sqlite 數據庫文件。

聲明:

if_exsists = 'append'

會將 append 的新數據強制到表中,如果表不存在,甚至創建表。

chunksize = 1000

這將一次寫入 1000 條記錄(如果少於 1000 條,則一次寫入)然后提交記錄,將數據保存到表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM