Çok sağolun bu tavsiyelerinizi dikkate alacağım.
Rica ederim. Kolay gelsin…
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)
Mükemmel 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.