Python ile sqlite veritabanını csv formatında nasıl export ederim?

arkadaşlar merhaba python tkinter ile butona bastığımda sqlite veritabanımı .csv formatında bir klasöre kaydetmek istiyorum bunu nasıl yapabilirim?

1 Beğeni

Merhaba,

  1. Başlıkları (header’ları) elde etmek
  2. Asıl verileri elde etmek
  3. Bir CSV dosyası oluşturup 1 & 2’yi buraya yazmak

İlk ikisini veri tabanı bağlantısı ile hallederiz. Diğerini ise csv modülü ile.

import csv
import sqlite3

# veri tabanı bağlantısı
con = sqlite3.connect("<veritabanı_dosyası>")

# cursor ile sorgu yaparız
cur = con.cursor()

# 1. başlıklar
cur.execute("PRAGMA table_info(<tablo_adı>)")
basliklar = [baslik_adi for _, baslik_adi, *_ in cur.fetchall()]

# 2. veriler
cur.execute("select * from <tablo_adı>")
veriler = cur.fetchall()

# 3. CSV dosyası
with open("<csv_dosyası>", mode="w", newline="") as fh:
    # dosyaya bir CSV yazarı bağlıyoruz
    yazar = csv.writer(fh)
    
    # 1 tek satır ("row" ile bitiyor) yazıyoruz evvela, o da `basliklar`
    yazar.writerow(basliklar)
    
    # Bir sürü satır ("rows" ile bitiyor) yazıyoruz sonra, asıl veriler
    yazar.writerows(veriler)

# açıkları kapatmak iyi olur
con.close()

Yorumların durumu anlatmasını ümit ediyorum. Şu kısım için

basliklar = [baslik_adi for _, baslik_adi, *_ in cur.fetchall()]

sorgudan sonra elimize başlık adlarının yanı sıra başlıklarla alakalı başka bilgiler de geliyor (örneğin veri tipleri). Bizim istediğimiz ise, bu demetler listesinde, her demetin 1. elemanını almak (0-indekslli). O yüzden 0. elemanı, ve 2. ve sonrasını _ ile görmezden geliyoruz (2 ve sonrasında birden fazla olduğundan *_ kullanarak hepsini oraya topluyor, görmezden geliyoruz):

sayilar = [4, 12, 19, 23, 61]
sifirinci, birinci, *ikinci_ve_sonrasi = sayilar

print(sifirinci)
print(birinci)
print(ikinci_ve_sonrasi)

Aynı şeyi şöyle de yazabilirsiniz

basliklar = [baslik_bilgisi[1] for baslik_bilgisi in cur.fetchall()]

Burada daha belirli 1. elemanı istediğimiz.

veya…

from operator import itemgetter

birinciyi_getir = itemgetter(1)
basliklar = [birinciyi_getir(baslik_bilgisi) for  baslik_bilgisi in cur.fetchall()]

tabii niye daha fazla yazdık denilebilir bu kısım için, ama…

basliklar = [*map(itemgetter(1), cur.fetchall())]

Neyse… İsterseniz o satırı (basliklar = ... satırını) silip direkt print(cur.fetchall()) deyip onun yerine, nasıl bir şeyin döndürüldüğünü gözlemleyebilirsiniz.

1 Beğeni

Affınıza sığınarak, bu işlem tek internet aramasıyla bulunabilecek gibi durmuyor… Ama soruyu soran kişinin yaptığı araştırmaları, şu ana kadar yazdığı kodu, veya taslak bir kodu paylaşması gerektiğini ima ettiyseniz, kuvvetle katılıyorum… Tercihen minimal, tekrarlanabilir bir kod aslında tabii… Her iki taraf için de zamandan tasarruf sağladığı gibi yanıtlayabilecek kişi sayısını 0-3 aralığından 0-33 aralığına çıkarabilir.

3 Beğeni

Emin olun saatlerce araştırmalarım incelemelerim sonucu bulamadıysam son çare olarak forumlara yazıyorum. Python a yeni başladığım için hangi kaynağı nerede ne şekilde bulabileceğimi bazen bilemiyorum.

Hocam öncelikle çok teşekkür ederim ne zaman konu açsam hızır gibi yetişiyorsunuz :slightly_smiling_face: özel mesajdan kodlarımı atsam inceleyebilir misiniz biraz kafam karıştı da

Her sey dogru anahtar kelimelerle alakali.

How to transfer data from sqlite to csv python

Python sqlite to csv

Python csv tutorial


Uzun vadede cok daha yararli oldugunu dusundugum icin basit bir problemi cozmek yerine arama motoru kullanma aliskanligi kazandirmaya calisiyorum.

2 Beğeni

Tavsiyeniz için teşekkürler

1 Beğeni