Anda benar begitulah .importcaranya, tapi itu adalah perintah dari shell SQLite3.exe. Banyak jawaban teratas untuk pertanyaan ini melibatkan loop python asli, tetapi jika file Anda besar (milik saya adalah 10 ^ 6 hingga 10 ^ 7 catatan), Anda ingin menghindari membaca semuanya ke dalam panda atau menggunakan pemahaman / loop daftar python asli (meskipun saya tidak mengatur waktunya untuk perbandingan).
Untuk file besar, saya yakin pilihan terbaik adalah membuat tabel kosong terlebih dahulu menggunakan sqlite3.execute("CREATE TABLE..."), menghapus header dari file CSV Anda, dan kemudian gunakan subprocess.run()untuk menjalankan pernyataan impor sqlite. Karena bagian terakhir adalah saya percaya yang paling relevan, saya akan mulai dengan itu.
subprocess.run()
from pathlib import Path
db_name = Path('my.db').resolve()
csv_file = Path('file.csv').resolve()
result = subprocess.run(['sqlite3',
str(db_name),
'-cmd',
'.mode csv',
'.import '+str(csv_file).replace('\\','\\\\')
+' <table_name>'],
capture_output=True)
Penjelasan
Dari baris perintah, perintah yang Anda cari adalah sqlite3 my.db -cmd ".mode csv" ".import file.csv table". subprocess.run()menjalankan proses baris perintah. Argumen ke subprocess.run()adalah urutan string yang ditafsirkan sebagai perintah yang diikuti oleh semua argumennya.
sqlite3 my.db membuka database
-cmdbendera setelah database memungkinkan Anda untuk meneruskan beberapa perintah ikuti ke program sqlite. Di shell, setiap perintah harus dalam tanda kutip, tetapi di sini, perintah hanya perlu menjadi elemen urutannya sendiri
'.mode csv' melakukan apa yang Anda harapkan
'.import '+str(csv_file).replace('\\','\\\\')+' <table_name>'adalah perintah impor.
Sayangnya, karena subproses meneruskan semua tindak lanjut ke -cmdstring yang dikutip, Anda perlu menggandakan garis miring terbalik jika Anda memiliki jalur direktori windows.
Stripping Header
Bukan poin utama dari pertanyaan itu, tapi inilah yang saya gunakan. Sekali lagi, saya tidak ingin membaca seluruh file ke dalam memori kapan pun:
with open(csv, "r") as source:
source.readline()
with open(str(csv)+"_nohead", "w") as target:
shutil.copyfileobj(source, target)