arkadaşlar merhaba python tkinter ile butona bastığımda sqlite veritabanımı .csv formatında bir klasöre kaydetmek istiyorum bunu nasıl yapabilirim?
Merhaba,
- Başlıkları (header’ları) elde etmek
- Asıl verileri elde etmek
- 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.
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.
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 ö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.
Tavsiyeniz için teşekkürler