Saya memiliki file CSV dan saya ingin mengimpor file ini secara massal ke database sqlite3 saya menggunakan Python. perintahnya adalah ".import .....". tapi sepertinya tidak bisa bekerja seperti ini. Adakah yang bisa memberi saya contoh bagaimana melakukannya di sqlite3? Saya menggunakan windows untuk berjaga-jaga. Terima kasih
106
Jawaban:
sumber
not all arguments converted during string formatting
ketika saya mencoba metode ini.Membuat koneksi sqlite ke file pada disk dibiarkan sebagai latihan bagi pembaca ... tetapi sekarang ada dua baris yang dimungkinkan oleh pustaka pandas
sumber
df
jadi saya mempersingkat contoh Anda menjadi:pandas.read_csv(csvfile).to_sql(table_name, conn, if_exists='append', index=False)
2 sen saya (lebih umum):
sumber
The
.import
perintah adalah fitur dari alat sqlite3 baris perintah. Untuk melakukannya dengan Python, Anda cukup memuat data menggunakan fasilitas apa pun yang dimiliki Python, seperti modul csv , dan memasukkan data seperti biasa.Dengan cara ini, Anda juga memiliki kendali atas tipe apa yang disisipkan, daripada mengandalkan perilaku sqlite3 yang tampaknya tidak terdokumentasi.
sumber
sumber
Terima kasih banyak atas jawaban bernie ! Harus sedikit mengubahnya - inilah yang berhasil untuk saya:
File teks saya (PC.txt) terlihat seperti ini:
sumber
Anda benar begitulah
.import
caranya, 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 gunakansubprocess.run()
untuk menjalankan pernyataan impor sqlite. Karena bagian terakhir adalah saya percaya yang paling relevan, saya akan mulai dengan itu.subprocess.run()
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 kesubprocess.run()
adalah urutan string yang ditafsirkan sebagai perintah yang diikuti oleh semua argumennya.sqlite3 my.db
membuka database-cmd
bendera 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
-cmd
string 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:
sumber
Berdasarkan solusi Guy L (Love it) tetapi dapat menangani bidang yang lolos.
sumber
Anda dapat melakukan ini menggunakan
blaze
&odo
efisienOdo akan menyimpan file csv ke
data.db
(database sqlite) di bawah skemadata
Atau Anda gunakan
odo
secara langsung, tanpablaze
. Apa pun itu baik-baik saja. Baca dokumentasi inisumber
Jika file CSV harus diimpor sebagai bagian dari program python, maka untuk kesederhanaan dan efisiensi, Anda dapat menggunakan
os.system
seperti yang disarankan oleh berikut ini:Intinya adalah dengan menentukan nama file dari database, maka data secara otomatis akan tersimpan, dengan asumsi tidak ada kesalahan saat membacanya.
sumber
sumber
demi kesederhanaan, Anda dapat menggunakan alat baris perintah sqlite3 dari Makefile proyek Anda.
make test.sql3
kemudian membuat database sqlite dari file test.csv yang ada, dengan satu tabel "test". Anda kemudianmake test.dump
dapat memverifikasi isinya.sumber
Saya telah menemukan bahwa perlu untuk memecah transfer data dari csv ke database dalam potongan-potongan agar tidak kehabisan memori. Ini bisa dilakukan seperti ini:
sumber