Python İçin Excel'de loop döngüsü

Hocam elleriniz öpülesi, gerçekten çok teşekkür ederim bunca çaba, yazı, uğraş çok değerli benim için. Çok çok teşekkür ederim…
Soruma gelecek olursa aslında iyi açıklamamışım suç benim öncelikle özrümü dilerim. Ben openpyxl ile bunu yapmaya çalıştım. Yapmaya çalıştığım hesabın adı poligon hesabıdır ve excel dosyası ekteki gibidir;
Screenshot_26
Bu dosya ne derseniz bizim mesleki işlerimiz, total station ölçümlerimizdir.

  1. satır 1. nokta
  2. satır 2. nokta
  3. satır 3. nokta için değerleri içerir. Gözünüzün önünde canlanması için şöyle anlatayım. Biz 1. noktada (ortadaki noktada) tam noktanın üzerine düzeçli olarak alet kurarız. Bu aletin ismi total stationdur. Sonra bir geriye (yani 2. noktaya) dürbünle bakış yaparız. Bu bakış esnasında 1. nokta ile 2. nokta arasındaki mesafemiz ölçülür ve aynı zamanda 2. noktaya bakarken yatay açımızı sıfır kabul ederiz. Sonra 3. noktaya aleti döndürürüz. Bu döndürme esnasında kırılma açısı bulunur ve 1 ile 3. nokta arasındaki mesafe de bulunur. Burada kafanız karışmasın, ilk satırdaki nokta aslında ortadaki noktadır. diğer 3lülerde de belli oluyor zaten. Koyu ile işaretlenmiş noktalar orta noktalardır. Mesale 10-11-12. satırlarda 667-666-668 diye sıralanır. Bunun sebebi orta noktanın ilk sırada, geri noktanın 2. sırada ileri noktanın ise 3. sırada yazılıyor olmasıdır. Bu sıralama hesaplama için önemlidir. Aslında yapmaya çalıştığımız bir bir açısı ve 2 kenarı bilinen bir üçgen oluşturmaktır şekildeki gibi;
    https://webders.net/img/geo/sinus-alan.jpg
    Yalnız buradaki önemli unsur şudur; burada 1 ve 2. noktanın koordinatları daha önceden belirlenmiş koordinatlardır ve bu koordinatlar ile yaptığımız bu ölçüm sayesinde 3. noktanın koordinatını buluruz. Şimdi artık elimizde 3. noktanın koordinatı mevcut. Bunu kullanarak 4. noktanın koordinatını bulacaz. Bu durumda ise işlemi tekrar ederek bu sefer 3. noktaya alet kurarız ve 2’ye geri, 4.'ye ise ileri bakış yaparak 4. noktanın koordinatını buluruz. Aklınızda canlanmıştır umarım. Bundan ötürü benim ilk 3lüde 3. noktanın koordinatını çıkartıp bu bulunan koordinat ile 4. noktanın, 4. nokta bulunduktan sonra 5. noktanın … diye sürekli loop şeklinde devam ettirmem gerekiyor. Fakat bu 3lü ölçüm 12 sefer de olabilir, 90 seferde. 12 sefer olursa 36 satır, 90 sefer olursa 270 satır elimde mevcut olacak. Hem sonlanacağı yeri bilmesi hem de bir önceki hesaptan bulduğu değeri de kullanarak 2. hesabı yapacak bir loop olması gerekli.
    Bu arada sütunlardan bahsedecek olursak; A sütunu nokta no, B sütunu yatay açı,C sütunu noktalar arası dikey açı(neredeyse 100 olmasının sebebi neredeyse dik olması, dikin tanımının 90 değil de 100 olma sebebi ise haritacılıkda derece değil grad kullanılıyor olmasıdır) D sütunu ise mesafeleri metre cinsinden göstermektedir.
    Aslında bu birçok yazılımda mevcut olan bir hesaplama. Ama ben daha özgün yapmak istiyorum, biraz daha ayrıntı versin ekrana istiyorum ondan kendim yazmaya soyundum açıkcası.

Ekte sadece bir ekran goruntusu var, herhangi bir dosya goremedim.

Hangi sitelerden bahsediyoruz? StackOverflow’da mesela durum oyleymis gibi gozukmuyor. (Yoksa bahsettigimiz siteler haritacilik siteleri ve gercekten bilinmeyen is haritacilik mi? Her halukarda ornek gormek isterim.)

​1. noktanin bir gerisi nasil 2. nokta oluyor?

Sayi olarak bakarsak 0. nokta olmasi lazim.
Ekran goruntusune bakarsak 0. satir olmasi lazim fakat 2. nokta 2. satirda degil miydi?

Kafamizin karismamasi icin “orta nokta”, “ortak nokta” veya “aci noktasi” gibi daha manali bir terim yok mu? “1. nokta” cok kotu bir ifade; ilk olculen nokta, ilk girilen nokta veya ilk siradaki noktayla karisabiliyor.

Hah, tamam. Fakat yukaridaki “1. nokta” ifadeleri duruyor, onlari degistirmek lazim.

Bunlari niye elle sayiyoruz? Satir numaralarini gosteren bir programda calissak?

Hi?

  1. nokta ilk sirada. 2. noktanin ismi “geri nokta”, 3. noktanin ismiyse “ileri nokta” yani? Okey.

Burada yeni terminoloji gelmis; A B ve C noktalari. Sirayla 1., 2. ve 3. noktalara denk geliyorlar galiba.

  1. noktanin koordinatini bilmiyorsak yukarida aleti 3. noktaya nasil dondurduk?

Bunu yeni duyuyoruz, bir tanitim lazim. Mesela 1. noktanin 1. satirda, 2. noktanin 2. satirda, 3. noktanin 3. satirda oldugu gibi 4. nokta da 4. satirda mi?

Yine bilmedigimiz bir noktaya bakis yapiyoruz. Ustelik sanirim “geri bakis” ve “ileri bakis” terimleri geldi.

Hi?

Uc tane mi olcum vardi? Keske noktalari numaralandirmak yerine olcumleri numaralandirsaydik. Yukari bakalim…

1

2 ve 3?

O zaman bunun 1 2 3 diye gitmesi gerekmiyor mu? 1. noktanin nokta no’su 0, 2. noktanin nokta no’su 0, 3. noktanin nokta no’su 211.42755 nasil oluyor?

Hangi iki nokta arasindaki?

Hangi noktalar arasi?

2 Beğeni

Kütüphanelerin dökümanlarına bakabilirsiniz:
https://openpyxl.readthedocs.io/en/stable/


Anlatımınızdan pek bir şey anlayamadığımı söylemem lazım, mesleğinizle alakalı ayrıntılar yerine ne yapmak istediğinizi sade bir şekilde anlatırsanız daha rahat yardım ederiz diye düşünüyorum. Noktalar için de A, B, C gibi harfler kullanırsak iyi olur.

1 Beğeni

Tekrar merhaba, diğer arkadaşlar aslında biraz bahsetmişler ama izninizle ben de biraz bahsedeyim.

Biz harita mühendisi olmadığımız için, sizin burada paylaştığınız verilere sayısal veri olarak bakıyoruz. Bunları nasıl ölçtüğünüz bizim için o kadar önemli değil. Bize ham verileri aşağıdaki gibi sunup, bu listelerdeki verilerin birbirleriyle nasıl bir bağlantı içerisinde olduğunu anlatabilirseniz, biz daha rahat yardımcı oluruz:

m4610021 = [0, 0, 0, 0.241]
pdf662 = [0, 100.53741, 161.344, 1.5]
pdk664 = [211.42755, 99.66593, 112.4381, 1.5]

Anladığım kadarıyla bold yaptığınız ifadeler sizin 3’lü veri dediğiniz şeye karşılık geliyor.
O halde size bir soru sorayım.
M4611002 ifadesi ile başlayan ve bunun gibi kalın olarak yazılmış satırlar, sizin ham verilerinizi mi oluşturuyor? Diğer satırlar da bu ham verileri kullanarak bir hesap sonucu bulduğunuz veriler mi?

Yani kısaca, bu tablodaki verilerin hangileri ölçümden gelen veriler, hangileri bu ölçümden gelen veriler üzerinde yapılan işlemler sonucu elde edilen veriler? Ve bu işlemlerin matematiksel formülleri neler bunları tıpkı sizinle yukarıda paylaştığım gibi kod görünümüne sokulmuş bir şekilde bizimle paylaşır mısınız?

Farzı misal, aşağıdaki veri sizin ham veriniz ise,

m4610021 = [0, 0, 0, 0.241]

Ve aşağıdaki veri de işlenmiş veri ise:

pdf662 = [0, 100.53741, 161.344, 1.5]

Ham veriyi kullanarak, işlenmiş veriyi nasıl oluşturuyorsunuz bunu gösterebilirseniz daha rahat yardımcı olabiliriz diye umuyorum.

Ayrıca paylaştığınız tabloda birden fazla sütun var. Bu yüzden daha önce paylaştığım kodları biraz değiştiriyorum, birden fazla sütun için kullanılabilir hale getiriyorum. Ama temel olarak kodların işleyişinde bir değişiklik olmayacak. Yani dışarıdan parametre olarak girdiğiniz veriler üzerinde işlemler yapılacak.

Belki istediğiniz böyle bir şey değil ancak ben fikir vermesi açısından sizinle paylaşayım.

from xlsxwriter.workbook import Workbook


class Spreadsheet(Workbook):
    def __init__(
            self, 
            columns: list = [], 
            data: tuple = (),
            *args, **kwargs
    ):
        super().__init__(*args, **kwargs)
        self.sheet = self.add_worksheet()
        self.columns = columns
        self.data = data   
        self.write()
        self.close()  
        
    def format(
            self,
            bold: bool = False,
            align: str = "",
            font_name: str = "Arial",
            font_size: int = 11
    ):
        return self.add_format(
            {
                "bold": bold,
                "align": align,
                "valign": "vcenter",
                "font_name": font_name,
                "font_size": font_size
            }
        )
        
    def f1(self, cols: int = 0, i: int = 0):
        return cols / sum(self.data[i])
        
    def f2(self, cols: int = 0, i: int = 0):
        return self.f1(cols=cols, i=i) * \
            (cols - (sum(self.data[i]) / len(self.data[i])))
        
    def f3(self, cols: int = 0, i: int = 0):
        return self.f2(cols=cols, i=i) ** 2
        
    def write(self):
        for i in range(len(self.data)):
            self.sheet.write(
                0, i,
                self.columns[i],
                self.format(align="center", bold=True)
            )        
            for index, cols in enumerate(self.data[i], 1):
                intvar = 0
                for data in [
                        cols, 
                        self.f1(cols=cols, i=i), 
                        self.f2(cols=cols, i=i), 
                        self.f3(cols=cols, i=i)
                ]:
                    self.sheet.write(
                        index + intvar, i,
                        data,
                        self.format(align="center")
                    )
                    intvar += len(self.data[i])

                
                
Spreadsheet(
    filename="test.xlsx", 
    columns=["A", "B"], 
    data=[[11, 21, 32], [10, 12, 27]]
)

Yukarıda, farklı sütunlar olacağı için hem işlemler yapan fonksiyonları hem de write metodunu değiştirdim. İzninizle write metodunu paylaşayım.

    def write(self):
        for i in range(len(self.data)):
            self.sheet.write(
                0, i,
                self.columns[i],
                self.format(align="center", bold=True)
            )        
            for index, cols in enumerate(self.data[i], 1):
                intvar = 0
                for data in [
                        cols, 
                        self.f1(cols=cols, i=i), 
                        self.f2(cols=cols, i=i), 
                        self.f3(cols=cols, i=i)
                ]:
                    self.sheet.write(
                        index + intvar, i,
                        data,
                        self.format(align="center")
                    )
                    intvar += len(self.data[i])

Sütun verisi de ekleyeceğimiz için iç içe 3 for döngüsü tanımlandı.

  1. döngü sütun verilerine ulaşmak için,
  2. döngü her bir sütundaki ham verilere ulaşmak için;
  3. döngü ise ham veri ve onunla yapılacak işlemleri içeren listemiz için.

Ve sınıftan bir örnek oluştururken de şu şekilde bir kod yazıldı:

Spreadsheet(
    filename="test.xlsx", 
    columns=["A", "B"], 
    data=[[11, 21, 32], [10, 12, 27]]
)

Ve örnek oluşturulur oluşturulmaz, şöyle bir tablo oluştu.
index

data parametresinin ilk listesi A sütununa, ikinci listesi ise B sütununa yerleştirildi.

Dediğim gibi beli bu anlattıklarımız sizin probleminizi çözmüyor ama en azından Python ile excel işlemlerinde for döngüsü kullanırken, hangi durumda nasıl bir döngü kurmanız gerektiği hakkında az çok bilgi verecektir diye umuyorum.

Naçizane tavsiyem, excel ile ilgili artık hangi kütüphaneyi kullanmak istiyorsanız onu kullanmaya geçmeniz, kodları inşa etme kısmında bir sorun yaşarsanız da buraya gelip yardım talebinde bulunmanız.

2 Beğeni

Örnek dosya şurda; https://dosya.co/w3pbga0aqbhq/deneme.xlsx.html

Aşağıdaki şekilde kodu yazdım ve istediğim sonucu veriyor ama sadece 1 nokta için;

import math
import matplotlib
import numpy
from openpyxl import load_workbook
excel=input(“Lütfen Dosya Yolunu Giriniz:”)
wb = load_workbook(excel)
sheet=wb.active
row_count = sheet.max_row
column_count = sheet.max_column
nokta_sayisi=(row_count-4)/3
kirilma_acisi=((row_count-4)/3)-1
nn1=sheet[‘a3’]
nn2=sheet[“a4”]
nn3=sheet[“a5”]
daci1=sheet[“c4”]
daci2=sheet[“c5”]
u1=sheet[“d4”]
u2_1=sheet[“d5”]
u2_2=sheet[“d7”]
u2=(((u2_1.value)+(u2_2.value))/2)
yaci1=sheet[“b5”]
y1=sheet[“b1”]
y2=sheet[“b2”]
x1=sheet[“c1”]
x2=sheet[“c2”]
ydel=y2.value-y1.value
xdel=x2.value-x1.value
m1=((((ydel)**2)+((xdel)**2))**0.5)
mfark1=m1-u2
a1=numpy.arctan((ydel)/(xdel))
a1_2=a1/math.pi 200
if ydel < 0 and xdel < 0:
a1_3=a1_2+400
elif ydel > 0 and xdel < 0:
a1_3=a1_2+200
elif ydel < 0 and xdel > 0:
a1_3=a1_2+200
else:
a1_3=a1_2
a1_4=a1_3+yaci1.value
a1_5=a1_4/200
math.pi
x3=x2.value+u2 math.cos(a1_5)
y3=y2.value+u2
math.sin(a1_5)
dosya = open(“SONUÇ.txt”,“w”,encoding=“utf-8”)
dosya.write(“Toplam Nokta Sayısı:{:.0f}\n”.format(nokta_sayisi))
dosya.write(“Toplam Kırılma Açısı Sayısı:{:.0f}\n”.format(kirilma_acisi))
dosya.write(“Durulan Nokta:{}\n”.format(nn1.value))
dosya.write(“Geri Bakış Yapılan Nokta:{}\n”.format(nn2.value))
dosya.write(“İleri Bakış Yapılan Nokta:{}\n”.format(nn3.value))
dosya.write("{} Noktasının Koordinatları: y: {:.3f} x: {:.3f}\n".format(nn3.value,y3,x3))
dosya.close()
print(“İşleminiz Gerçekleştirilmiş ve Sonuç.txt Dosyasına Aktarılmıştır…”)
print(“Programdan çıkılıyor…”)
wb.close()

Arkadaşlar şu şekilde hem göstereyim hem de anlatayım; kodu yazdım ve çalışır vaziyette. Burdaki asıl sıkıntı şu kısmı nası döngüye sokarak diğer hücreleri otomatik olarak tanıtacağımdır;
nn1=sheet[‘a3’]
nn2=sheet[“a4”]
nn3=sheet[“a5”]
daci1=sheet[“c4”]
daci2=sheet[“c5”]
u1=sheet[“d4”]
u2_1=sheet[“d5”]
u2_2=sheet[“d7”]
u2=(((u2_1.value)+(u2_2.value))/2)
yaci1=sheet[“b5”]
y1=sheet[“b1”]
y2=sheet[“b2”]
x1=sheet[“c1”]
x2=sheet[“c2”]
ydel=y2.value-y1.value
xdel=x2.value-x1.value
m1=((((ydel)**2)+((xdel)**2))**0.5)
mfark1=m1-u2
a1=numpy.arctan((ydel)/(xdel))
a1_2=a1/math.pi 200
if ydel < 0 and xdel < 0:
a1_3=a1_2+400
elif ydel > 0 and xdel < 0:
a1_3=a1_2+200
elif ydel < 0 and xdel > 0:
a1_3=a1_2+200
else:
a1_3=a1_2
a1_4=a1_3+yaci1.value
a1_5=a1_4/200
math.pi
x3=x2.value+u2 math.cos(a1_5)
y3=y2.value+u2
math.sin(a1_5)

yani bu kısımdaki verileri nasıl döngüye sokacağım, sokarsam mesela d5 hücresindeki verinin bir sonrasında d8i yapmasını nasıl sağlayacağım ve bu işlemi yaptıktan sonra bir fazla daha dosyaya nasıl yazdıracağım aklıma gelmiyor. Şu anki tek mantıklı fikir 1den 100 e kadar 100 adet py hazırlayıp, kullanıcının kaç nokta kullanacağına göre o py dosyasını işleme sokmak. veya bunu tek yazılım içerisinde yapmak if elif else ile. Döngüye sokamıyorum bir türlü.

Kodunuzu buraya göre düzenler misiniz:

Bu bana hiç mantıklı gelmedi, işlemi 200 defa yapmak isterseniz ne olacak?

Döngü kullanmanız lazım, kodu verdiğim linke göre atarsanız kolayca hallederiz.

1 Beğeni

Satır ve sütunları tek tek tanımlamak yerine onlara da döngüyle ulaşabilirsiniz.

1 Beğeni

İşte aradığım cevap bu :))
Açıkcası kodu nasıl yollayacağımı bilemedim isterseniz upload edebilirim. Onu hangi kodla nasıl yapacağımı gösterirseniz belki ben de halledebilirim. Düzgün bir bilgiye ulaşamadım internette excelde loop ile ilgili. Aslında çok bilgi var ama işime tam olarak yarayanı bulamadım. Aklımda yukardaki kısmı bir fonksiyon olarak tanımlayarak istediğim yerde loop ile kullanma mantığında.

Dostum size zaten hangi satıra, hangi sütuna nasıl gidebileceğinizi yukarıdaki kod örneklerinde gösterdim aslında. Belki class yapısını görmemiş olabilirsiniz. Ama geri kalan her şeyin ne anlama geldiğini biliyor olmanızda fayda var. Neyse ben yukarıdaki kodları class yapısından çıkarttım ve fonksiyon haline getirdim. Fonksiyonlara ve ilgili yerlere açıklamalar yazdım, umarım yardımı olur. Kodları iyice bir inceleyin, bazı yerlerini değiştirin tekrar çalıştırın. Döngü kurmak zor bir iş değil. Yeterince odaklanırsanız, aşağıdaki kodları anlayacağınızı tahmin ediyorum.

from xlsxwriter.workbook import Workbook, Worksheet


def frmt(
        wb: Workbook = None,
        bold: bool = False,
        align: str = "",
        font_name: str = "Arial",
        font_size: int = 11
) -> None:
    """
    Bu fonksiyon hücre içini biçimlendirmek için kullanılıyor.
    :param wb: Tipi 'Workbook' olan argüman
    :param bold: Tipi 'bool' olan argüman
    :param align: Tipi 'str' olan argüman
    :param font_name: Tipi 'str' olan argüman
    :param font_size: Tipi 'int' olan argüman
    :return: Geri dönen bir değer yok.
    """
    wb.add_format(
        {
            "bold": bold,
            "align": align,
            "valign": "vcenter",
            "font_name": font_name,
            "font_size": font_size
        }
    )


def olasilik(raw_data: list = [], cols: int = 0, i: int = 0) -> float:
    """
    Ham veriyle işlem yapan alelade bir fonksiyon. Bu fonksiyon
    sırası gelen ham veri eklendikten sonra çalışacak. Ve bu fonksiyon
    sayesinde işlenmiş olan yeni veri, ham veride bulunan bir sütunda 
    toplam kaç tane satır verisi varsa o kadar satır boş bırakılarak
    eklenecek. Yani ilk sütunun ilk ham verisi 2. satıra yazılmışsa ve
    bu sütuna ait toplamda 3 tane satır verisi varsa, işlenen veri 5.
    satıra yazılır.
    :param raw_data: Tipi 'list' olan ham verilere ait argüman
    :param cols: Tipi 'int' olan sırası gelen veriye ait argüman
    :param i: Tipi 'int' olan sıra numarasına ait argüman
    :return: Tipi 'float' olan ve işlem sonucunda oluşacak olan veri.
    """
    return cols / sum(raw_data[i])


def write(
        wb: Workbook = None,
        ws: Worksheet = None,
        raw_data: list = [],
        columns: list = []
) -> None:
    """
    Yazma işlemi için kullanılacak olan fonksiyon. Döngüleri
    burada kuracağız. İlk döngü ham verideki sütunları tarayacak.
    İkinci döngü bir sütuna ait bütün ham verilere ulaşacak.
    Son döngü ise hem ham verimizi hem de bu ham veri ile yapılacak
    işlem için kullanılacak. 
    :param wb: Tipi 'Workbook' olan argüman
    :param ws: Tipi 'Worksheet' olan argüman
    :param raw_data: Tipi 'list' olan ham verilere ait argüman
    :param columns: Tipi 'list' olan ve sütun isimleriyle ilgili argüman
    :return: Geri dönen bir değer yok.
    """
    # raw_data'daki her bir sütun boyunca
    for i in range(len(raw_data)):
        # Sütunları 0'ıncı satıra ve i'ninci sütuna yazıyoruz.
        # Aşağıda toplam iki tane sütun tanımlandı. O halde i
        # önce 0 olacak sonra 1 olacak.
        ws.write(
            0, i,
            columns[i],
            frmt(wb=wb, align="center", bold=True)
        )
        # Bir sütun verisindeki her satır verisi için:
        for index, cols in enumerate(raw_data[i], 1):
            # intvar isimli bir değişken tanımlıyoruz.
            # Bu değişken üstteki for döngüsü başa her
            # sardığında tekrar tanımlanacak.
            intvar = 0
            # Ve yapacağımız her işlem için de bir döngüye
            # ihtiyacımız var. Bu işlemlerden bir tanesi
            # dışarıdan alacağımız veriyi excel tablosuna
            # eklemek, diğer işlem her bir ham veri için
            # basit bir işlem yapmak. Bu işlem bir sütundaki
            # bütün ham veriler için olasılık değerini hesaplamak olsun.
            for data in [
                cols,
                olasilik(raw_data=raw_data, cols=cols, i=i),
            ]:
                # Burada da verileri index + intvar satırına ve
                # i sütununa ekliyoruz.
                ws.write(
                    index + intvar, i,
                    data,
                    frmt(wb=wb, align="center")
                )
                # Döngü başa sarmadan, intvar değişkenini bir sütunda
                # kaç tane veri varsa o kadar artırıyoruz.
                intvar += len(raw_data[i])


def main():
    """
    Ana programımız. Yukarıdaki fonksiyonları tanımladıktan
    sonra bu fonksiyonla programı çalıştıracağız.
    :return: Geri dönen bir değer yok. 
    """
    # Çalışma kitaplığını tanımlıyoruz.
    workbook = Workbook(filename="test.xlsx")
    # Bir tane çalışma sayfası ekliyoruz.
    sheet = workbook.add_worksheet()
    # Yazdırma fonksiyonunu parametrelerini doldurarak çağırıyoruz.
    write(
        wb=workbook,
        ws=sheet,
        raw_data=[[11, 21, 32], [10, 12, 27]],
        columns=["A", "B"]
    )
    # Çalışma kitaplığını kapatıyoruz.
    workbook.close()


# İşlemleri başlatacak olan fonksiyonumuzu çağırıyoruz.
main()
2 Beğeni

Örnekler:

  1. Aşağıdaki kodlar 1. satırın A sütununa merhaba, B sütununa ise dünya yazısını ekler.
    1
from xlsxwriter.workbook import Workbook, Worksheet


def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
    for column in range(len(data)):
        ws.write(0, column, data[column])


def main():
    workbook = Workbook(filename="test.xlsx")
    sheet = workbook.add_worksheet()
    write(wb=workbook, ws=sheet, data=["merhaba", "dünya"])
    workbook.close()
    
    
main()
  1. Aşağıdaki kodlar 1. satıra merhaba ikinci satıra ise dünya yazısını ekler.
    2
from xlsxwriter.workbook import Workbook, Worksheet


def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
    for row in range(len(data)):
        ws.write(row, 0, data[row])


def main():
    workbook = Workbook(filename="test.xlsx")
    sheet = workbook.add_worksheet()
    write(wb=workbook, ws=sheet, data=["merhaba", "dünya"])
    workbook.close()
    
    
main()
  1. Aşağıdaki kodlar 1. satırın A sütununa merhaba, B sütununa dünya yazılarını ve 2. satırın A sütununa merhaba ve B sütununa evren yazılarını ekler.
    3
from xlsxwriter.workbook import Workbook, Worksheet


def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
    for row in range(len(data)):
        for column in range(len(data[row])):
            ws.write(row, column, data[row][column])


def main():
    workbook = Workbook(filename="test.xlsx")
    sheet = workbook.add_worksheet()
    write(
        wb=workbook, 
        ws=sheet, 
        data=[["merhaba", "dünya"], ["merhaba", "evren"]]
    )
    workbook.close()
    
    
main()
  1. Aşağıdaki kodlar A sütunun 1. satırına merhaba, 2. satırına dünya yazılarını ve B sütunun 1. satırına merhaba, 2. satırına evren yazılarını ekler.
    4
from xlsxwriter.workbook import Workbook, Worksheet


def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
    for column in range(len(data)):
        for row in range(len(data[column])):
            ws.write(row, column, data[column][row])


def main():
    workbook = Workbook(filename="test.xlsx")
    sheet = workbook.add_worksheet()
    write(
        wb=workbook, 
        ws=sheet, 
        data=[["merhaba", "dünya"], ["merhaba", "evren"]]
    )
    workbook.close()
    
    
main()
  1. Aşağıdaki kodlar 0’dan 99’a kadar olan sayıları her bir satırda ve sütunda 10 adet sayı olacak şekilde ekler. Sayılar satır boyunca birer birer, sütun boyunca onar onar artar.
from xlsxwriter.workbook import Workbook, Worksheet


def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
    row = 0
    column = 0
    for i in range(len(data)):
        if i != 0 and i % 10 == 0:
            column = 0
            row += 1
        ws.write(row, column, data[i])
        column += 1


def main():
    workbook = Workbook(filename="test.xlsx")
    sheet = workbook.add_worksheet()
    write(
        wb=workbook, 
        ws=sheet, 
        data=range(100)
    )
    workbook.close()
    
    
main()
  1. Aşağıdaki kodlarda ise 5. örnekteki tablonun tam tersi bir tablo oluşturulur. 0’dan 100’e kadar olan sayılar sütunlar boyunca birer birer, satırlar boyunca da onar onar artar.
from xlsxwriter.workbook import Workbook, Worksheet


def write(wb: Workbook = None, ws: Worksheet = None, data: list = []):
    row = 0
    column = 0
    for i in range(len(data)):
        if i != 0 and i % 10 == 0:
            row = 0
            column += 1
        ws.write(row, column, data[i])
        row += 1


def main():
    workbook = Workbook(filename="test.xlsx")
    sheet = workbook.add_worksheet()
    write(
        wb=workbook, 
        ws=sheet, 
        data=range(100)
    )
    workbook.close()
    
    
main()
3 Beğeni

Umuyorum döngü kullanarak bir veri çerçevesi (dataframe) oluşturmak için bu örnekler size yardımcı olabilir. Bu örnekleri siz çeşitlendirebilirsiniz. Bazı durumlarda döngü sayısını arttırmanız gerekebilir. Karşınızda nasıl bir veri var ona göre döngü miktarını belirleyebilirsiniz. Umarım bu örnekler ve bir önceki mesajda açıklamalı olarak yazmaya çalıştığım kodların faydası olur.

1 Beğeni

Gerekli linki atmıştım, okudunuz mu acaba? :

Arkadaşlar özürlerimi iletiyorum, bu kodu buraya yazmayı beceremedim bir türlü nedense. Link olarak yükledim kodu bu; https://www.dosyaupload.com/7cyl
Örnek çoklu nokta dosyası bu;https://dosya.co/w3pbga0aqbhq/deneme.xlsx.html
Döngüyü beceremediğim için kod ile çalışan tek noktalık bir excel dosyası ürettim o da bu; https://www.dosyaupload.com/7cym
Çoklu nokta dosyası ile yapamadığım için tek noktalık excel dosyası üzerinde çalışmaya başladım. Yani bu gönderdiğim kod tek noktalık excel dosyası üzerinde çalışıyor sadece fakat kodun kaldığı yer tam olarak şu an döngüye sokmam gereken ve beceremediğim yer. Bir türlü yapamadım şunu. Sanırım mantığını tam kapamadım maalesef.

Önce deneme.xlsx dosyasındaki sütunlara birer isim verin. Hangi sütun ne anlama geliyor bilinmesi gerekiyor. Yoksa pandas ilk satırınızdaki değerleri sütun isimleriymiş gibi kullanacak.

import pandas as pd

df = pd.read_excel("deneme.xlsx")
print(df)

Çıktı:

       PDK662    425310.181  4199219.5672  627.1923  Unnamed: 4
0    M4610021  425261.18110  4.199373e+06  629.7863         NaN
1    M4610021       0.00000  0.000000e+00    0.0000       0.241
2      PDK662       0.00000  1.005374e+02  161.3440       1.500
3      PDK664     211.42755  9.966593e+01  112.4381       1.500
4      PDK664       0.00000  0.000000e+00    0.0000       1.436
..        ...           ...           ...       ...         ...
211    PDK734       0.00000  0.000000e+00    0.0000       1.509
212    PDK733       0.00000  1.000749e+02  143.9119       1.500
213  M4610024     180.45019  9.988460e+01  180.3346       0.284
214  M4610024  429390.42810  4.206900e+06  722.0615         NaN
215    PDK736  429398.74970  4.207006e+06  720.7790         NaN

[216 rows x 5 columns]

Yukarıdaki tablonun düzeltilmiş hali şöyle oluyor.

            A             B             C         D      E
0      PDK662  425310.18100  4.199220e+06  627.1923    NaN
1    M4610021  425261.18110  4.199373e+06  629.7863    NaN
2    M4610021       0.00000  0.000000e+00    0.0000  0.241
3      PDK662       0.00000  1.005374e+02  161.3440  1.500
4      PDK664     211.42755  9.966593e+01  112.4381  1.500
..        ...           ...           ...       ...    ...
212    PDK734       0.00000  0.000000e+00    0.0000  1.509
213    PDK733       0.00000  1.000749e+02  143.9119  1.500
214  M4610024     180.45019  9.988460e+01  180.3346  0.284
215  M4610024  429390.42810  4.206900e+06  722.0615    NaN
216    PDK736  429398.74970  4.207006e+06  720.7790    NaN

[217 rows x 5 columns]

Bir döngü oluşturmak istediğinizi söylediniz. Bunu öyle bir şekilde anlatmalısınız ki, biz şöyle düşünebilelim:

Döngünün her bir adımı 3 veya 4 artık ne kadarsa o kadarlık bir satır aralığı ile çalışıyor. Her satır aralığının şu şu satırlarının şu şu sütunlarını almak gerekiyor. Bu aldığımız değerlerler ile şöyle şöyle işlemler yapacağız.

Döngü kurarak hücrelere ulaşmakta sıkıntı yok. Siz sadece her bir döngü adımında hangi hücrelerdeki verilerin alınması gerekiyor onu söyleyin.

Bunu yapmadığınız takdirde, size çok yardımcı olamayız.

https://www.youtube.com/watch?v=pglP-Q50PjQ Hocam şurda açıkladım video ile. İnşallah tam olarak anlatabilmişimdir.

Bu arada deneme.xlsx dosyasının ilk satırına sütun isimlerini temsil eden bir şeyler yazdım. Siz de böyle yapın.

1.py dosyasında gördüğüm kadarıyla oluşturmak istediğiniz döngünün 1. adımında 6 tane satır kullanıyorsunuz ve bu satırlardan belirli hücreleri kullanıyorsunuz. Buna dayanarak şöyle bir kod yazdım.

Not: “A” sütunu 0., “B” sütunu ise 1. sütun anlamına geliyor.

import pandas as pd


def get(values, rows, column):
    return [values[i - 1][column] for i in rows]


def value_range(df, start, end):
    values = df.values[start: end]
    return {
        "nn": get(values, [3, 4, 5, 6], 0),
        "daci": get(values, [4, 5], 2),
        "u": get(values, [4, 5], 3),
        "yaci": get(values, [5], 1),
        "y": get(values, [1, 2, 6], 1),
        "x": get(values, [1, 2, 6], 2)
    }


def main():
    df = pd.read_excel("deneme.xlsx")
    print(value_range(df, 0, 6))


main()

Bu koddaki value_range(df, 0, 6) ifadesi 0 ile 6. satır arasındaki değerleri alıyor ve get fonksiyonunun parametrelerine verilen değerler ile de ilgili satır ve sütunlardaki değerleri alıyoruz.

Paylaştığınız python dosyasında, bir kereye mahsus almış olduğunuz değerleri ekrana yazdırdım ve onların hangi sütun ve satırlarda olduğunu buldum.

Lütfen Dosya Yolunu Giriniz:deneme.xlsx
M4610021 PDK662 PDK664 PDK664
100.53741 99.66593
161.344 112.4381
211.42755
4199219.5672 4199373.2563 0

Yukarıdaki kodlar da bu düzene göre oluşturuldu. Siz print(value_range(df, 0, 6)) yazdığınız zaman bu değerleri içeren bir sözlük alacaksınız. Yani yukarıdaki kodları çalıştırırsanız alacağınız çıktı şöyle olacak:

{
    'nn': ['M4610021', 'PDK662', 'PDK664', 'PDK664'], 
    'daci': [100.53741, 99.66593], 
    'u': [161.344, 112.4381], 
    'yaci': [211.42755], 
    'y': [425310.181, 425261.1811, 0.0], 
    'x': [4199219.5672, 4199373.2563, 0.0]
}

Eğer o ifadeyi print(value_range(df, 6, 12)) şeklinde değiştirirseniz bu sefer alacağınız çıktı şöyle olur.

{
    'nn': ['PDK666', 'PDK664', 'PDK667', 'PDK667'],
    'daci': [100.25794, 98.95513],
    'u': [276.2369, 142.3544],
    'yaci': [232.89788],
    'y': [0.0, 218.7435, 0.0],
    'x': [100.27239, 99.66487, 0.0]
}

ihtiyacınız olan değerleri value_range fonksiyonundan dönen sözlük verisinin anahtar sözcüklerini kullanarak alabilirsiniz. Bu value_range fonksiyonu bir döngü içerisine sokulabilir ve her seferinde parametreleri altışar altışar arttırılabilir. Bir bakın bakalım, bir hata var mı?

Ancak print(value_range(df, 0, 6)) ifadesi ile elde edilen verilerle yapılacak işlemlerle x ve y değerlerini oluşturuyor ve bu değerleri bir sonraki aşamanın x ve y değerleri olarak kullanıyorsak, bu print(value_range(df, 6, 12)) bize istenen değerleri vermeyebilir.

1 Beğeni

Maalesef hocam bu şekilde olmadı. 3. satırdan sonra her 3 satır için döngüye sokmam gerekli. Verdiğim örnekteki nn1=sheet[‘A3’] satırının her döngüde 3 satır artması gerekli ve en son bulduğu değerden devam etmesi gerekli. Yani 1. döngüde A3 iken ikinci döngüde A6, 3. döngüde A9 olarak ilerlemesi lazım. Ha keza diğer spesifik veriler için de aynısı olması gerekli. Mesela daci2=sheet[“c5”] değerinin de 2. döngüde C8 ve 3. döngüde C11 olarak ilerlemesi gerekli. Hepsinin 3’er artarak ilerlemesi lazım. Halen beceremedim, bilgisayara kafa atacam :smiley:

Birinci döngüden elde edilen ve 2. döngüde kullanılacak olan değerler 1.py dosyasındaki x4 ve y4 değerleri mi?

Kodunuzda kullandığınız dxfwrite kütüphanesi ezdxf kütüphanesinin kullanılmasını öneriyor.

Kodunuzu çalıştırmayı deneyince bu hatayı alıyorum:

Warning (from warnings module):
  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 53
    return _prepare_from_string(" ".join(pjargs))
FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6

Warning (from warnings module):
  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 294
    projstring = _prepare_from_string(" ".join((projstring, projkwargs)))
FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
Traceback (most recent call last):
  File "C:\Users\Dinçel\Desktop\Projects\voyager\1.py", line 144, in <module>
    inProj = Proj(init='epsg:5258')
  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\proj.py", line 126, in __init__
    self.crs = CRS.from_user_input(projparams, **kwargs)
  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 440, in from_user_input
    return CRS(value, **kwargs)
  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\site-packages\pyproj\crs\crs.py", line 296, in __init__
    super().__init__(projstring)
  File "pyproj\_crs.pyx", line 2338, in pyproj._crs._CRS.__init__
pyproj.exceptions.CRSError: Invalid projection: +init=epsg:5258 +type=crs: (Internal Proj Error: proj_create: no database context specified)