Казалось бы, задача простая, и для такой махины как Pyton не проблема обработать несколько файлов Excel на пару сотен строк.
Все верно, объединить несколько файлов Excel в один используя код для Pyton несложно.
А что если строк тысячи? Или, скажем, пару миллионов? Или самих файлов несколько тысяч, а в них две сотни столбцов в каждом?
Сейчас в рамках этой #заметки я покажу вам стабильный код, который способен оперировать огромными массивами информации в Pyton, объединить все файлы. И при этом не закрашить систему.
Код:
- Просмотрит папку и все вложенные в неё файлы и папки
- Отберёт только Excel файлы для объединения
- Извлечет, прочитает данные из формата xlsx
- Совместит всё в одном списке
- Найдет дубликаты и удалит (опционально)
- Положит всё «на один лист» Excel. Можно и на несколько.
- Выдаст готовый xlsx файл.
Совмещаем Excel файлы в Pyton: подготовка
Как установить Pyton в вашу систему я рассказывать не буду, но пару деталей всё равно нужно знать.
- Установите pandas — основной компонент для работы с Excel-файлами и их совмещению
pip install pandas
- Установите компонент для визуального отслеживания прогресса
pip install tqdm
С ним вы сможете понимать сколько времени импортируются файлы, сколько времени происходит непосредственно объединение.
Также можно прикрутить и что-то для отслеживания расхода ram, но лично мне не понадобилось, на пике любые объединения отъедали не больше пары гб, разве что поиск дубликатов в полмиллионе строк занял 3 гб.
- Включите в код компонент обеспечивающий корректную работу с кириллическими путями
from pathlib import Path
Объединяем файлы Excel
Уже сложили все файлы xlsx в одну папку? Отлично! Тогда приступим:
import pandas as pd
from pathlib import Path
from tqdm import tqdm
# Путь к папке с файлами
folder_path = Path('/Users/home/Library/Temp')
# Создание пустого списка для хранения DataFrame’ов
frames = []
# Получаем список файлов для объединения
files_list = [file for file in folder_path.glob('**/*.xlsx')]
# Объединение всех файлов .xlsx в один большой файл
for file_path in tqdm(files_list, desc='Объединение файлов', unit='файл'):
df = pd.read_excel(file_path, header=0) # Используем первую строку в качестве заголовка
frames.append(df)
# Объединение всех DataFrame’ов из списка
merged_frame = pd.concat(frames, ignore_index=True)
# Сохранение объединенного файла в новом файле merged.xlsx
output_file = 'merged.xlsx'
merged_frame.to_excel(output_file, index=False)
# Вывод сообщения о завершении скрипта
print("Процесс завершен")
Вам нужно только заменить здесь путь до ваших файлов, код будет работать.
Объединяем таблицы Excel и удаляем дубликаты
Что если объединяемые файлы Excel содержат дублирование? Мы ведь этого не хотим?
Добавьте этот код, который не только объединит все Excel файлы из папки в один, но и удалит дублирующиеся строки.
tqdm.pandas(desc="Удаление дубликатов")
df_unique = merged_frame.drop_duplicates(subset='Email', keep='first')
В данном случае в качестве заголовка столбца по которому происходит поиск дубликатов для примера указан «Email». У вас он наверняка будет другой, так ведь? 🙂
Добавить код необходимо перед этапом сохранения.
Бонус: код для разделения и удаления Excel столбцов в Pyton
Код для удаления столбцов из нескольких конкретных файлов:
import pandas as pd from pathlib import Path from tqdm import tqdm folder_path = Path('/Users/') files_list = ['new1.xlsx', 'new2.xlsx', 'new3.xlsx'] columns_to_remove = ["ID", "Индекс", "Адрес", "Время работы", "Способы оплаты", "odnoklassniki"] for file_name in files_list: file_path = folder_path / file_name df = pd.read_excel(file_path) df.drop(columns=columns_to_remove, inplace=True, errors='ignore') output_file = folder_path / (file_name.split('.')[0] + '_b.xlsx') df.to_excel(output_file, index=False) print(f"Файл '{file_name}' обработан.") print("Работа сделана.")
Код для разделения первого столбца на два, межой является запятая.
import pandas as pd
from pathlib import Path
# Путь к исходному файлу
input_file_path = Path('/Temp/file.xlsx')
# Чтение исходного файла
df = pd.read_excel(input_file_path)
# Разделение первого столбца на два столбца по первой запятой
df[['Column1', 'Column2']] = df.iloc[:, 0].apply(lambda x: pd.Series(str(x).split(',', 1)))
# Сохранение измененного файла
output_file_path = input_file_path.parent / 'final.xlsx'
df.to_excel(output_file_path, index=False)
print(f"Файл '{input_file_path.name}' успешно обработан. Результат сохранен как 'short_b.xlsx'.")
Что-то не получилось? Есть полезные замечания? Смело пишите комментарии!