Yazdığım programda şarkı sürelerini toplayan bir fonksiyon oluşturmam lazım. Bunu yapabilen bi modül var mı?
Şarkılar dosya halinde mi yoksa Spotify gibi bir platformda mı dosya ise formatı ne hiçbir detay belirtmemişsiniz. Ayrıca yazdığınız kod varsa da oradan ilerlememiz daha iyi olur.
Hocam şarkılar sqlite3 veri tabanında bir tablo halinde olacak. Girdiğim şarkıların sürelerini toplayacak bir modül lazım. Program üretmeye çalışmıyorum aldığım kursun ödevi bu şekilde. Modül bulamazsam diye şöyle bir kod yazdım ama çalışmadı:
zaman1 = float(input('Bir saat giriniz: '))
hours_to_add = float(input('Eklenecek saati giriniz: '))
new_time = str((zaman1 + hours_to_add))
new_time.split(".")
if (new_time[-1]==6):
new_time[0]+=1
print(new_time)
Sqlite tablosu neye benzeyecek acaba? Şarkı ismi ve saniye cinsinden süresi mi olacak tabloda? Eğer öyleyse ve anladığım kadarıyla tüm şarkıların süreleri toplamını bulmak için şöyle bir SQL sorgusu yapabilirsin:
SELECT SUM(SONG_DURATIONS) FROM LISTED_SONGS
(SONG_DURATIONS) şarkı sürelerinin yazdığı sütun olmalı.
cursor.execute("SELECT SUM(SONG_DURATIONS) FROM LISTED_SONGS")
total_songs_duration = cursor.fetchone()
import datetime
def sum_songs(*args):
total = 0
for time in args:
song_time = datetime.datetime.strptime(time, "%H:%M:%S")
song_seconds = (song_time.hour * 3600) + ((song_time.minute) * 60) + song_time.second
total+=song_seconds
time = datetime.timedelta(seconds=total)
return str(time)
print(sum_songs("1:48:45", "0:52:35", "0:1:32"))
SAAT:DAKİKA:SANİYE
formatıyla (örnekteki gibi) tüm şarkıları fonksiyona verirseniz size totalde ne kadar sürdüğünü döndürecek. örnekteki kodun çıktısı
2:42:52
yani 2 saat 42 dakika 52 saniye
50 kere edit yaptım yine sonunda aynı şey kaldı yazık oldu biraz
con=sqlite3.connect("C:/Users/user1/OneDrive/Masaüstü/Sqlite Veri Tabanı/şarkıdeneme.db")
cursor=con.cursor()
def sarki():
sorgu="CREATE TABLE IF NOT EXISTS Şarkılar(süre)"
con.execute(sorgu)
con.commit()
def sarkiEkle(süre):
cursor.execute("Insert Into Şarkılar Values(?)",(süre,))
con.commit()
def sureHesapla():
sorgu="SELECT SUM(süre) FROM Şarkılar"
cursor.execute("SELECT SUM(süre) FROM Şarkılar")
total_songs_duration = cursor.fetchone()
print(total_songs_duration)
Öncelikle zaman ayırdığınız için teşekkür ederim. Bu şekilde yazdım ve 3.50 ile 4.10 olmak üzere iki adet süre ekledim. 8.00 olarak göstermesi gerekirken 7.6 gösteriyor. Kodda mı hata var acaba ya da atladığım bir nokta?
Basit bir şekilde makesambanın koduyla süreyi integer cinsinden saniyeye çevirip tabloya öyle yazarak bir daha deneyebilirsiniz. Ve aynı şekilde toplam şarkı süresini konsola yazdıracaksanız bu sefer de datetime.datetime.strftime kullanabilirsiniz.
Yeni başladığım için bu tarz şeyler şimdilik bana zor geliyor. Yazdığınız kodun mantığını anlamaya çalışmam bile bu dilde beni geliştirecektir. Çok teşekkür ederim.
Deneyeceğim teşekkür ederim tekrardan.
Kodu satır satır anlatayım o zaman hazır boş vaktim varken.
sum_songs fonksiyonuna sınırsız sayıda parametre verebilmem için (çünkü kaç tane şarkıyı toplayacağım hiçbir zaman belli olmayacak) *args kullandım. bu *args bir tuple olarak fonksiyon içerisinde kullanılabilir hale geldi. Kısaca args şöyle bir şey oldu
def sum_songs(*args):
print(args)
sum_songs("0:2:42", "0:4:52", "0:5:12")
> args = ("0:2:42", "0:4:52", "0:5:12")
total değişkenini başta 0 olarak tanımladım ve args içerisinde döngüye girdim. Bu döngüdeki her bir iterasyon sizin fonksiyona verdiğiniz parametre. Örneğin ilk iterasyonum yukarıdaki örnek üzerinden gidersem “0:2:42” olacak.
daha sonra datetime.datetime.strptime ile verdiğim parametrenin formatını belirttim. yani dedim ki “0:4:52” şeklinde verilen string aslında “%H:%M:%S” şeklinde bir zaman belirtiyor. %H = hour, %M = minute, %S = second yani burada datetime kütüphanesine verdiğim süreyi tanıttım.
song_time ile datetime objesine çevirdiği zamanı song_seconds içerisinde kullanacağım
song_seconds değişkeninde song_time’ın saatini 3600 ile çarp (1 saat 3600 saniye) + song_time’ın dakikasını 60 ile çarp (1 dakika 60 saniye) + song_time’ın saniyesi
daha sonra tüm bunları total değişkenine ekledim.
total değişkenim şu an verdiğim tüm “zamanların” toplam saniyesini tutuyor ancak bana saat dakika ve saniye formatında bir veri gerekli. bu sebeple datetime.timedelta ya bu total değişkenini veriyorum.
seconds=total demem çok önemli, direkt olarak total veremem.
en sonundaysa time değişkenini string’e çevirip döndürüyorum.
Şu an çok daha anlaşılır oldu her şey. Teşekkür ediyorum hocam tekrardan. Yalnız timedeltanın tarihler arasındaki farkı tutmaya yaradığı yazıyor. timedelta kullanarak nasıl saat, dakika, saniye formatına çevirdiğimizi anlayamadım.
saat, dakika, saniye olarak döndürmek için de kullanılıyor fakat arkada dönen mantığı maalesef ben de bilmiyorum incelemek lazım aslında
Şöyle bir kod yazdım örnek için bakabilirsiniz ayrıca:
import sqlite3 as sql
import datetime
SONG_DURATION_FORMAT = "%M:%S"
STRING_EXIT_SIGNAL = "exit"
is_exit_signal = lambda string_input: string_input == STRING_EXIT_SIGNAL
def create_database_connection(file_name: str):
return sql.connect(file_name)
def create_database_table():
db_cursor.execute("CREATE TABLE IF NOT EXISTS SONGS_LIST (SONG_NAME TEXT, SONG_DURATION INT)")
db_conn.commit()
def parse_string_duration(string_time: str) -> datetime.datetime:
try:
return datetime.datetime.strptime(string_time, SONG_DURATION_FORMAT)
except ValueError:
pass
def add_song(song_name: str, song_duration: datetime.timedelta):
db_cursor.execute("INSERT INTO SONGS_LIST VALUES (?, ?)", (song_name, song_duration.total_seconds()))
db_conn.commit()
def get_total_song_duration() -> datetime.timedelta:
db_cursor.execute("SELECT SUM(SONG_DURATION) FROM SONGS_LIST")
return datetime.timedelta(seconds=db_cursor.fetchone()[0])
if __name__ == "__main__":
db_conn = create_database_connection(":memory:")
db_cursor = db_conn.cursor()
create_database_table()
while True:
song_name = input("Şarkı adı: ")
if is_exit_signal(song_name):
print("Çıkılıyor...")
break
song_duration = parse_string_duration(input("Şarkı süresi: "))
if not song_duration:
print(f"Geçersiz zaman formatı. Geçerli zaman formatı: {SONG_DURATION_FORMAT}")
continue
add_song(song_name, datetime.timedelta(minutes = song_duration.minute, seconds = song_duration.second))
total_song_duration = get_total_song_duration()
print(f"Toplam şarkı süresi: {total_song_duration}")