Dosyaları Karşılaştırıp En Yenilerini Dataframe'e Ekleme

Arkadaşlar merhabalar, Python’da iki farklı klasördeki aynı isimde olan Excel dosyalarını tarayıp bu dosyaların en yenilerini Dataframe’ime eklemek istiyorum. Bunu nasıl yapabilirim acaba bu konuda yardımcı olabilir misiniz?

Konu hakkında pek bilgim yok ama internette biraz araştırma yapıp şu kodları buldum. O an bulunduğunuz dizindeki dosyaları oluşturulma tarihine göre listeliyor. Umarım yardımcı olur.

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time

#Relative or absolute path to the directory
dir_path = sys.argv[1] if len(sys.argv) == 2 else r'.'

#all entries in the directory w/ stats
data = (os.path.join(dir_path, fn) for fn in os.listdir(dir_path))
data = ((os.stat(path), path) for path in data)

# regular files, insert creation date
data = ((stat[ST_CTIME], path)
           for stat, path in data if S_ISREG(stat[ST_MODE]))

for cdate, path in sorted(data):
    print(time.ctime(cdate), os.path.basename(path))

Kaynak: https://www.w3resource.com/python-exercises/python-basic-exercise-71.php

1 Beğeni

Çok sağolun deniyorum şimdi

Merhabalar yeniden,

Ben iki ayrı klasör içerisindeki dosyaları karşılaştırmak istiyorum fakat sizin attığınız kodlar o an bulunan dosyayı analiz ediyor.

Biraz düzenleme yaptım. Açıklama kodun içinde mevcut.

from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time

#Bu kısma kontrol etmek istediğiniz 1. klasörün dizinini yazıyorsunuz.
dir_path = ".."

data = (os.path.join(dir_path, fn) for fn in os.listdir(dir_path))
data = ((os.stat(path), path) for path in data)

data = ((stat[ST_CTIME], path)
           for stat, path in data if S_ISREG(stat[ST_MODE]))

for cdate, path in sorted(data):
    print(time.ctime(cdate), os.path.basename(path))


 #Bu kısma kontrol etmek istediğiniz 2. klasörün dizinini yazıyorsunuz.
dir_path = "."

data = (os.path.join(dir_path, fn) for fn in os.listdir(dir_path))
data = ((os.stat(path), path) for path in data)

data = ((stat[ST_CTIME], path)
           for stat, path in data if S_ISREG(stat[ST_MODE]))

for cdate, path in sorted(data):
    print(time.ctime(cdate), os.path.basename(path))
1 Beğeni

Merhaba, acaba aşağıdaki yöntemin yardımı dokunur mu?

İki tane dizin var diyelim: Birinin adı yol1, diğerinin adı yol2:

yol1’in içinde 2 tane excel dosyası ve 1 tane text dosyası var.
yol2’nin içinde de 2 tane excel dosyası ve diyelim 1 mp3 dosyası var.
Yani her iki dizinde eşit sayıda dosya var.
Bu excel dosyalarının isimleri aynı, ancak hücrelerdeki veriler ve dosyaların değiştirilme zamanları farklı.

Şu başlıktaki yönteme aşağıdaki “karsilastir” fonksiyonunu ekleyince nasıl bir sonuç alıyorsunuz?

import pandas as pd
import xlsxwriter
import numpy as np
import os


def dosyadan(kaynak, hedef):
    oku = pd.read_excel(kaynak, header=None)
    workbook = xlsxwriter.Workbook(hedef)
    worksheet = workbook.add_worksheet()
    satir = 0
    for i in range(len(oku.values)):
        sutun = 0
        for j in oku.values[0]:
            sec = pd.read_excel(kaynak, parse_cols="{0}:{0}".format(j), header=None)
            df = pd.DataFrame(sec, index=[satir])
            numpy_data = df.get_values()
            string_data = np.array2string(numpy_data).replace("[", "").replace("]", "").replace("'", "")
            worksheet.write(satir, sutun, string_data)
            sutun += 1
        satir += 1
    workbook.close()


def dizinden(kaynak_dizin, hedef_dizin):
    if not os.path.exists(hedef_dizin):
        os.mkdir(hedef_dizin)
    for i in os.listdir(kaynak_dizin):
        if i.endswith("xlsx") or i.endswith("xls"):
            kaynak_ = os.sep.join([kaynak_dizin, i])
            hedef_ = os.sep.join([hedef_dizin, i])
            dosyadan(kaynak_, hedef_)


def karsilastir(dizin1, dizin2, hedef):
    for i, j in zip(os.listdir(dizin1), os.listdir(dizin2)):
        if i.endswith("xlsx") or i.endswith("xls"):
            dosya1 = os.path.join(dizin1, i)
            zaman1 = os.stat(dosya1).st_mtime
            if j.endswith("xlsx") or j.endswith("xls"):
                dosya2 = os.path.join(dizin2, j)
                zaman2 = os.stat(dosya2).st_mtime
                if i == j:
                    if zaman1 > zaman2:
                        dosyadan(dosya1, os.path.join(hedef, i))
                    else:
                        dosyadan(dosya2, os.path.join(hedef, j))
                

if __name__ == "__main__":
    # Aşağıdaki yolları ve hedefi kendi bilgisayarınızdaki
    # klasör düzenine göre değiştirin.
    yol1 = os.path.join(os.getcwd(), "yol1")
    yol2 = os.path.join(os.getcwd(), "yol2")
    karsilastir(yol1, yol2, os.getcwd())
1 Beğeni

Aşağıdaki kodlara ulaştım fakat buradaki kodlar klasörün ismini veriyor, Excel dosyaları özelinde bir seçim yapamıyorum.

import os
import pandas as pd

filelist = ['your/path/tofile1', 'your/path/tofile2', 'your/path/tofile3', etc]
filedate = 0
for file in filelist:
    if os.path.getmtime(file) > filedate: 
        newestfile, filedate = file, os.path.getmtime(file)
pd.read_excel(newestfile)

Hocam, paylaştığınız kodlardaki etc tanımsız? Ayrıca son satırdaki pd.read_excel(newestfile) çalışmaz? Bir önceki mesajımda paylaştığım kodları inceleyip çalıştırdıktan sonra sonucu paylaşır mısınız?

Merhabalar, yardımlarınız için çok teşekkürler, komutu denedim fakat komutları Pycharm’da çalıştırdığımda herhangi bir şey çıkmıyor, acaba hedef= /…/… yazısı olan kısmı da değiştirmem mi gerekiyor? En sondaki komutu
print(karsilastir(yol1, yol2, hedef="/.../../."))

olarak düzenliyorum fakat None yazısı çıkıyor. Hedef kısmını değiştirdiğimde de herhangi bir değişiklik olmadı.

yol1, yol2 ve hedef’i değiştirmeniz gerekiyor. Ayrıca yol1 ve yol2 dizinlerinde eşit sayıda dosya olmalı.

Merhabalar, bu kuralı kaldırma şansımız var mıdır? Çünkü dinamik bir dosya olacak karşılaştırdığım dosyalar.

Ayrıca çok teşekkürler yeniden bu alanda yeni olduğumdan çok detaylı bilgiye sahip değilim okuyarak öğrenmeye çalışıyorum. Bu aşamada çok yardımınız oldu.

Tabi, bu kuralı kaldırabiliriz. Her iki dizindeki dosyaların eşit sayıda olması gerekliliği zip() fonksiyonunu kullandığımız içindi, zip()'i kaldırıp kodlar aşağıdaki gibi yazıldığında artık böyle bir kural olmaz.

# Yukarıdaki fonksiyonlar aynen duruyor.


def karsilastir(dizin1, dizin2, hedef):
    for i in os.listdir(dizin1):
        if i.endswith("xlsx") or i.endswith("xls"):
            dosya1 = os.path.join(dizin1, i)
            zaman1 = os.stat(dosya1).st_mtime
            for j in os.listdir(dizin2):
                if j.endswith("xlsx") or j.endswith("xls"):
                    dosya2 = os.path.join(dizin2, j)
                    zaman2 = os.stat(dosya2).st_mtime
                    if i == j:
                        if zaman1 > zaman2:
                            dosyadan(dosya1, os.path.join(hedef, i))
                        else:
                            dosyadan(dosya2, os.path.join(hedef, j))


if __name__ == "__main__":
    # Aşağıdaki yolları ve hedefi kendi bilgisayarınızdaki
    # klasör düzenine göre değiştirin.
    yol1 = os.path.join(os.getcwd(), "yol1")
    yol2 = os.path.join(os.getcwd(), "yol2")
    karsilastir(yol1, yol2, os.getcwd())
Traceback (most recent call last):
  File "C:/Users/Asus/.PyCharm2017.2/config/scratches/scratch_7.py", line 79, in <module>
    karsilastir(yol1, yol2, os.getcwd())
  File "C:/Users/Asus/.PyCharm2017.2/config/scratches/scratch_7.py", line 71, in karsilastir
    dosyadan(dosya2, os.path.join(hedef, j))
  File "C:/Users/Asus/.PyCharm2017.2/config/scratches/scratch_7.py", line 16, in dosyadan
    sec = pd.read_excel(kaynak, parse_cols="{0}:{0}".format(j), header=None)
  File "C:\Users\Asus\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\excel.py", line 212, in read_excel
    **kwds)
  File "C:\Users\Asus\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\excel.py", line 450, in _parse_excel
    should_parse[j] = self._should_parse(j, parse_cols)
  File "C:\Users\Asus\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\excel.py", line 323, in _should_parse
    return i in _range2cols(parse_cols)
  File "C:\Users\Asus\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\excel.py", line 315, in _range2cols
    cols += lrange(_excel2num(rng[0]), _excel2num(rng[1]) + 1)
  File "C:\Users\Asus\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\compat\__init__.py", line 118, in lrange
    return list(range(*args, **kwargs))
OverflowError: Python int too large to convert to C ssize_t

Şeklinde bir hata alıyorum.

Tam olarak çalıştırdığınız kodları buraya aktarabilir misiniz?

import pandas as pd
import xlsxwriter
import numpy as np
import os



def dosyadan(kaynak, hedef):
    oku = pd.read_excel(kaynak, header=None)
    workbook = xlsxwriter.Workbook(hedef)
    worksheet = workbook.add_worksheet()
    satir = 0
    for i in range(len(oku.values)):
        sutun = 0
        for j in oku.values[0]:
            sec = pd.read_excel(kaynak, parse_cols="{0}:{0}".format(j), header=None)
            df = pd.DataFrame(sec, index=[satir])
            numpy_data = df.get_values()
            string_data = np.array2string(numpy_data).replace("[", "").replace("]", "").replace("'", "")
            worksheet.write(satir, sutun, string_data)
            sutun += 1
        satir += 1
    workbook.close()


def dizinden(kaynak_dizin, hedef_dizin):
    if not os.path.exists(hedef_dizin):
        os.mkdir(hedef_dizin)
    for i in os.listdir(kaynak_dizin):
        if i.endswith("xlsx") or i.endswith("xls"):
            kaynak_ = os.sep.join([kaynak_dizin, i])
            hedef_ = os.sep.join([hedef_dizin, i])
            dosyadan(kaynak_, hedef_)


def karsilastir(dizin1, dizin2, hedef):
    for i, j in zip(os.listdir(dizin1), os.listdir(dizin2)):
        if i.endswith("xlsx") or i.endswith("xls"):
            dosya1 = os.path.join(dizin1, i)
            zaman1 = os.stat(dosya1).st_mtime
            if j.endswith("xlsx") or j.endswith("xls"):
                dosya2 = os.path.join(dizin2, j)
                zaman2 = os.stat(dosya2).st_mtime
                if i == j:
                    if zaman1 > zaman2:
                        dosyadan(dosya1, os.path.join(hedef, i))
                    else:
                        dosyadan(dosya2, os.path.join(hedef, j))


if __name__ == "__main__":
    # Aşağıdaki yolları ve hedefi kendi bilgisayarınızdaki
    # klasör düzenine göre değiştirin.
    yol1 = os.path.join(os.getcwd(), "C:\Karşılaştırma Tablosu")
    yol2 = os.path.join(os.getcwd(), "C:\Karşılaştırma Tablosu\İlkrevize")
    karsilastir(yol1, yol2, hedef="C:\Karşılaştırma Tablosu\BASE TABLO")

def karsilastir(dizin1, dizin2, hedef):
    for i in os.listdir(dizin1):
        if i.endswith("xlsx") or i.endswith("xls"):
            dosya1 = os.path.join(dizin1, i)
            zaman1 = os.stat(dosya1).st_mtime
            for j in os.listdir(dizin2):
                if j.endswith("xlsx") or j.endswith("xls"):
                    dosya2 = os.path.join(dizin2, j)
                    zaman2 = os.stat(dosya2).st_mtime
                    if i == j:
                        if zaman1 > zaman2:
                            dosyadan(dosya1, os.path.join(hedef, i))
                        else:
                            dosyadan(dosya2, os.path.join(hedef, j))


if __name__ == "__main__":
    # Aşağıdaki yolları ve hedefi kendi bilgisayarınızdaki
    # klasör düzenine göre değiştirin.
    yol1 = os.path.join(os.getcwd(), "C:\Karşılaştırma Tablosu")
    yol2 = os.path.join(os.getcwd(), "C:\Karşılaştırma Tablosu\İlkrevize")
    karsilastir(yol1, yol2, os.getcwd())

Hocam yollar yanlış değiştirilmiş. Ayrıca if name == “main”: ifadesini iki defa kullanmışsınız, karsilastir fonksiyonu bu iki if ifadesinin arasında bir daha yazılmış…

yol1 = "C:\\Karşılaştırma Tablosu"
yol2 = "C:\\Karşılaştırma Tablosu\\İlkrevize"
yol3 = "C:\\...\..." 
# Yukarıdaki gibi bir dizin yazmalısınız.
# Bu dizin os.getcwd()'de olur. 
# Yeni dosyaların nerede oluşmasını istiyorsanız
# o dizini belirtmelisiniz.
karsilastir(yol1, yol2, yol3)

Lütfen aşağıdaki kodları bir daha inceleyin, yol3’ü belirlemeniz gerekiyor.

import pandas as pd
import xlsxwriter
import numpy as np
import os


def dosyadan(kaynak, hedef):
    oku = pd.read_excel(kaynak, header=None)
    workbook = xlsxwriter.Workbook(hedef)
    worksheet = workbook.add_worksheet()
    satir = 0
    for i in range(len(oku.values)):
        sutun = 0
        for j in oku.values[0]:
            sec = pd.read_excel(kaynak, parse_cols="{0}:{0}".format(j), header=None)
            df = pd.DataFrame(sec, index=[satir])
            numpy_data = df.get_values()
            string_data = np.array2string(numpy_data).replace("[", "").replace("]", "").replace("'", "")
            worksheet.write(satir, sutun, string_data)
            sutun += 1
        satir += 1
    workbook.close()


def dizinden(kaynak_dizin, hedef_dizin):
    if not os.path.exists(hedef_dizin):
        os.mkdir(hedef_dizin)
    for i in os.listdir(kaynak_dizin):
        if i.endswith("xlsx") or i.endswith("xls"):
            kaynak_ = os.sep.join([kaynak_dizin, i])
            hedef_ = os.sep.join([hedef_dizin, i])
            dosyadan(kaynak_, hedef_)


def karsilastir(dizin1, dizin2, hedef):
    for i in os.listdir(dizin1):
        if i.endswith("xlsx") or i.endswith("xls"):
            dosya1 = os.path.join(dizin1, i)
            zaman1 = os.stat(dosya1).st_mtime
            for j in os.listdir(dizin2):
                if j.endswith("xlsx") or j.endswith("xls"):
                    dosya2 = os.path.join(dizin2, j)
                    zaman2 = os.stat(dosya2).st_mtime
                    if i == j:
                        if zaman1 > zaman2:
                            dosyadan(dosya1, os.path.join(hedef, i))
                        else:
                            dosyadan(dosya2, os.path.join(hedef, j))


if __name__ == "__main__":
    yol1 = "C:\\Karşılaştırma Tablosu"
    yol2 = "C:\\Karşılaştırma Tablosu\\İlkrevize"
    yol3 = "C:\\...\..." 
    # Yukarıdaki gibi bir dizin yazmalısınız.
    # Bu dizin os.getcwd() de olabilir. 
    # Yeni dosyaların nerede oluşmasını istiyorsanız
    # o dizini belirtmelisiniz.
    karsilastir(yol1, yol2, yol3)
1 Beğeni

Gerçekten size ne kadar teşekkür etsem az. Çok sağolun yeniden. Ne kadar zamanda bu kodları kendim yazabilecek seviyeye gelirim bilmiyorum ama önümde baya bir yolum olduğu kesin.

Yazabilirsiniz bence ama hani bir deyiş vardır ya, merdivenin basamaklarını adım adım çıkmak gerekir diye. Bazı konular öğrenilmeden, pandas gibi bir modülü kullanmak zor gelebilir. Gerçekten, python’ın temel programlama bilgilerini öğrendiğim, pekiştirdiğim bir dönemde ne pandas ile ilgileniyordum ne de başka bir modülle. Hatta günün birinde bu modülleri kullanabilir miyim acaba diye düşünüyordum. Kodlar o kadar karışık geliyordu. Halen karışık gelen kodlarla karşılaşıyorum.

1 Beğeni