Klasör İçerisindeki Tüm Excel Dosyalarını Açıp Birleştirmek ve Birleştirilmiş Halini Excel Olarak Kaydetmek

Arkadaşlar herkese Hayırlı akşamalar.
Foruma yeni katıldım. Payton öğrenmeye de yeni başladım. Soruma gelince; Bir Klasör İçerisindeki tüm Excel Dosyalarını Açıp Birleştirmek ve Birleştirilmiş Halini Excel Olarak Kaydetmek istiyorum. Fakat bunu tam olarak yapamadım. Tek başlık altında birleştirme olmuyor.
Kullandığım kod;

import glob
import pandas as pd

df = pd.DataFrame()
for f in glob.glob(r"D:\PYTHON_DATA\Yeni klasör/.xlsx"):
df = pd.read_excel(f)
NewData=pd.concat([df],ignore_index=True,axis=0)
print(NewData)
NewData
NewData.to_excel(“D:/PYTHON_DATA/NewData.xlsx”,index=False)

Merhaba,

Detay verebilir misin?
Klasördeki tüm excel dosyaları aynı yapıya mı sahip, yani hepsinde aynı sütun sayısında ve sütun isimlerinde veri var.
Örnek bir excel dosyasını ya da ekran görüntüsünü paylaşabilir misiniz?

Hocam, ilginiz için teşekkür ederim.
Excel dosyalarının tamamı aynı sütuna sahip ve başlık sayıları da aynı
Tüm dosyalarda sütun isimi var

Rica ederim.
Ben elimdeki hakediş dosyalarını birleştirmek için zamanında yazmış olduğu aşağıdaki kodu kullanıyorum.
Bu koda sahip python dosyamı, excel dosyaları ile aynı klasöre kopyalayarak çalıştırıyorum.

#!/usr/bin/env python
# coding: utf-8

# Aynı klasörde bulunan excel dosyalarını birleştiren python kodu.
# Tüm dosya içeriği birleştirildikten sonsa "TUMU.xlsx" adında yeni bir dosyaya kaydedilecek.
# Python Kodunun çalışması için bilgisayarınızda "Pandas", "openpyxl" ve "xlrd." kütüphanelerinin / modüllerinin yüklü olması gerekir.

import pandas as pd
import os

dosyalar = os.listdir()     # "birlestir.py" dosyasının bulunduğu dizindeki (klasördeki) TÜM DOSYA isimlerini, uzantıları ile birlikte al, "dosyalar" isimli listeye ekle / ata.

if "TUMU.xlsx" in dosyalar:         # Klasör içinde "TUMU.xlsx" dosyasının olup olmadığını kontrol et, varsa aşağıdaki kodları çalıştır.
    os.remove("TUMU.xlsx")          # Klasör içindeki "TUMU.xlsx" isimli dosyayı sil.
    dosyalar.remove("TUMU.xlsx")    # "TUMU.xlsx" isimli öğeyi "dosyalar" listesinden çıkar. 

dosya_isimleri= []                  # ".xlsx", ".xls" ya da ".ods" uzantılı dosyaların toplanacağı boş liste oluştur.

for i in dosyalar:                  # Dizindeki tüm dosya isimlerini kontrol et, ".xlsx", ".xls" ya da ".ods" uzantılı dosyaları "dosya_isimleri" listesine ekle.
    if ((i[-5:] == ".xlsx") or (i[-4:] == ".xls") or (i[-4:] == ".ods") ):     # dosya uzantılarını kontrol et.
        dosya_isimleri.append(i)

def VeriCercevesi(dosya_adi):       # Belirtilen dosya adına göre, dosya içeriğini DataFrame'e çeviren fonksiyon.
    return pd.read_excel(dosya_adi, sheet_name="Sayfa 1", skiprows=range(0,5), usecols=range(1,13), index_col="SIRA NO")

baslik = VeriCercevesi(dosya_isimleri[0]).columns   # İlk dosyanın basligini al. Diğer dosyalardaki başlıklar silinecek, bu başlık eklenecek.

def VeriCercevesiBasliksiz(dosya_adi):              # Belirtilen dosya adına göre, dosya içeriğini Başlıksız DataFrame'e çeviren fonksiyon.
    return pd.read_excel(dosya_adi, sheet_name="Sayfa 1", header=None, names=baslik, skiprows=range(0,7), usecols=range(2,13))   # Dosya adındaki başlık silinecek, klasördeki ilk dosyanın başlığı tüm diğer dosyalara başlık olarak eklenecek.

data_frame = pd.DataFrame()         # Verileri toplayacağımız boş bir veri çerçevesi oluşturuyoruz.

for dosya in dosya_isimleri:
        df_dosya = VeriCercevesiBasliksiz(dosya)
        df_dosya["Dosya_Adi"] = dosya
        data_frame = pd.concat([data_frame, df_dosya])

data_frame.dropna(thresh=6, inplace=True) # tüm verileri almak istiyorsak, thresh parametresini silmeliyiz.

data_frame.to_excel("TUMU.xlsx")    # Tüm dosyalar birleştirildikten sonra sonuç "TUMU.xlsx" ismi ile kaydedilir.

skiprows, usecols, header, names parametreleri ile alakalı bilgi almak isterseniz buraya göz atabilirsiniz.

1 Beğeni

Hocam, yazdığınız kodu uygulayamadım.

Excel dosyalarının tamamı aynı sütuna sahip ve başlık sayıları da aynı
Dosyaların tamamının sütun isimleri var

Benim yazmaya çalıştığım kod birleştirmeyi tam olarak neden yapamıyor
import glob
import pandas as pd

df = pd.DataFrame()
for f in glob.glob(r"D:\PYTHON_DATA\Yeni klasör/.xlsx"):
df = pd.read_excel(f)
NewData=pd.concat([df],ignore_index=True,axis=0)
print(NewData)
NewData
NewData.to_excel(“D:/PYTHON_DATA/NewData.xlsx”,index=False)

Aşağıdaki kod, bende çalıştı.
Siz de kendinize uyarlayıp dener misiniz?

import glob
import pandas as pd

NewData = pd.DataFrame()

for f in glob.glob(r"/home/mhalil/hakedis_3/*.xlsx"):
    df = pd.read_excel(f)
    NewData = pd.concat([NewData, df],ignore_index = True, axis = 0)

NewData.to_excel("/home/mhalil/hakedis_3/Tüm_Ataşmanlar.xlsx",index=False)

Sizin kodunuzdaki for f in glob.glob(r"D:\PYTHON_DATA\Yeni klasör/.xlsx"): satırında, .xlsx ten önce * (yıldız) karakteri eksik. for f in glob.glob(r"D:\PYTHON_DATA\Yeni klasör/*.xlsx"): bu şekilde olmalı.

concat fonksiyonu parametre olarak, liste içinde 2 veri çerçevesi almalı. örnek kullanım: pd.concat([df1, df2])
Sizin kodunuzda tek parametre yazılmış. NewData=pd.concat([df] ...)

Kaynak:

1 Beğeni

Hocam teşekkür ederim. elinize emeğinize sağlık.

  • karakteri normalde var ama gözükmüyor.

Rica ederim.
Yıldız karakterinin görünmeme sebebi, kodlarınızı kod bloğu içerisinde yazmamanızdan kaynaklanıyor. Yıldız karakteri madde imi, eğik (italik) yazı *italik* ve kalın (bold) yazı **kalın (bold) yazı** gibi farklı amaçlar için de kullanılıyor.
Kodlarınızı paylaşmadan önce CTRL+e tuşlarına basarak ya da araç çubuğundaki önceden biçimlendirilmiş metin simgesine tıklamanız ve kod bloğunu açmanız gerekir.

1 Beğeni