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

Çok sağolun bu tavsiyelerinizi dikkate alacağım.

Rica ederim. Kolay gelsin…

1 Beğeni

Merhabalar, en son yazdığınız kod çalışıyor, belirtilen dizine kopyalama işlemini yapıyor fakat aynı hatayı vermeye devam ediyor. Dün ise herhangi bir hata vermiyordu. Acaba bunun nedeni ne olabilir?
Bir de buradaki kodlar yeni oluşturulmuş Excel dosyasını biçimlendirmiş şekilde hedef dizinine kopyalıyor. Aynı şekilde herhangi bir işlem yapmadan kopyalamak mümkün müdür? worksheet.write(satir, sutun, string_data) komutunu değiştirerek yapmayı denedim fakat kodların bütünlüğü bozulduğundan işe yaramadı.

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:\\abc"
    # 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)

Yani kodlar hem istediğiniz kopyalama işlemini yapıyor hem de aynı zamanda aşağıdaki hatayı mı veriyor?

OverflowError: Python int too large to convert to C ssize_t

Dosyalar, pandas modülünü kullandığımız için yeniden biçimlendiriliyor. Yani bir dosyanın içindeki veriler alınıyor, başka bir dosya oluşturulup onun içine yerleştiriliyor.

Anladığım kadarıyla sizin yapmak istediğiniz ise şöyle bir işlem:

İki tane dizinin içindeki aynı ada sahip dosyalar (excel dosyaları) değiştirilme tarihine göre karşılaştırılsın, en güncel olan dosyalar başka bir dizine kopyalansın. Bu işlem için pandas modülünü kullanmanıza gerek yok. Kopyalama işlemi open() fonksiyonu ile yapılabilir.

Evet yukarıdaki kodları aynen kullanıyorum. İstediğim klasörde yeni oluşturulan dosyayı görebiliyorum. Ayrıca bu dosyanın tarihi de kodu çalıştırdığım zamana güncellenmiş olarak karşıma geliyor. Bu konuda herhangi bir problem yaşanmıyor ancak aşağıdaki uyarıyı alıyorum. Open() fonksiyonuna şimdi bakıyorum, çok teşekkürler.

Traceback (most recent call last):
  File "C:/Users/Asus/.PyCharm2017.2/config/scratches/scratch_10.py", line 60, in <module>
    karsilastir(yol1, yol2, yol3)
  File "C:/Users/Asus/.PyCharm2017.2/config/scratches/scratch_10.py", line 48, in karsilastir
    dosyadan(dosya2, os.path.join(hedef, j))
  File "C:/Users/Asus/.PyCharm2017.2/config/scratches/scratch_10.py", line 15, 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

Peki bu iki dizinde hiç iç içe geçmiş klasörler var mı?

Yol1 ve yol2’de var fakat bunları aşağıdaki gibi ayırdım yine aynı hatayı verdi. Eğer open() fonksiyonu ile bu problem de çözülüyorsa bu sorun üzerine daha fazla sizi yormak istemem. open() ile aynı şeyi yeniden denemeye çalışacağım.

yol1 = "C:\\Karşılaştırma Tablosu"
yol2 = "C:\\ilkrevize"

Aşağıdaki kodları çalıştırmayı bir deneyin.

import os


def copyfile(source, target):
    with open(source, "rb") as f1:
        with open(target, "wb") as f2:
            for i in f1:
                f2.write(i)


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:
                            copyfile(dosya1, os.path.join(hedef, i))
                        else:
                            copyfile(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:\\abc"
    karsilastir(yol1, yol2, yol3)
1 Beğeni

Mükemmel :slight_smile: başka ne diyebilirim ki! Çok teşekkürler çalışıyor şu an

Rica ederim. Hata aldığınızı söyledikten sonra o programı bir daha çalıştırdım hata vermedi. Şaşırdım, acaba hata nerden nasıl oluşuyor diye düşünüyorum. Aklıma birkaç tane ihtimal geliyor, bunlardan birisi klasörler iç içe geçmiştir idi ancak sonradan düşündüm hata veren bu olmasa gerek. Çok çok iç içe geçmiş klasörlerdeki dosyaları araştırmaz ama hata da verdirmez. Sonra acaba klasör isminden ötürü mü oluşuyor diye düşündüm. Mesela dizinlerin isimlerinde Türkçe karakterler var. Yani hatanın neyden kaynaklandığını anlayamadım henüz.

Ben de anlayamadım. Dosya isimlerini değiştirdim fakat aynı hatayı vermeye devam etti. Stackoverflow’da bu hata ile ilgili versiyon güncelleme işlemi gerekiyor diye bir şey okumuştum belki öyle bir şey olabilir.Şu an için sorunsuz çalışıyor çok sağolun yeniden.

Neyse, hatayla ilgili birşeyler bulursam paylaşırım. İyi geceler dilerim. Kolay gelsin.

Çok sağolun iyi geceler size de kolay gelsin

Eğer başka bir yerde kullanmayacaksanız yani kişisel kullanım için yazıyorsanız git de kullanabilirsiniz.

1 Beğeni