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
Ç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))
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())
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)
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.