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

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)

Sanırım pyproj eksik sizde. Pyproj koorinat çevrimi için kullanılan bir kütüphane. Ondan ötürü hata vermiş olabilir.

Aynen öyle hocam. x4 ve y4 sürekli döngüye girmesi gereken.

Tamam, bir daha bakarım.

Gerekli bütün kütüphaneleri indirdim, zaten dikkat ederseniz yükseltilen hata ModuleNotFoundError değil.

Benim anlamadığım bir durum var. Siz her seferinde üç satırın kullanıldığını söylemiştiniz. Ama kodlarınıza bakıyorum, 6 satır kullanmışsınız. Bu değerlerin döngünün ikinci adımına geçtiğinde nasıl değişeceğini bir yazar mısınız?

nn1=sheet['a3']
nn2=sheet["a4"]
nn3=sheet["a5"]
nn4=sheet["a6"]
daci1=sheet["c4"]
daci2=sheet["c5"]
u1=sheet["d4"]
u2_1=sheet["d5"]
yaci1=sheet["b5"]
y1=sheet["b1"]
y2=sheet["b2"]
y3=sheet["b6"]
x1=sheet["c1"]
x2=sheet["c2"]
x3=sheet["c6"]

@EkremDincel

Şu linkteki dosyalardan birini indirince sorun devam ediyor mu?

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyproj