Как получить данные из excel python

Как получить данные из excel python

Работа с Excel-файлами в Python не требует громоздких решений – достаточно библиотек pandas, openpyxl или xlrd, в зависимости от формата и задач. Формат .xlsx поддерживается наиболее широко, особенно при использовании openpyxl в связке с pandas.

Для загрузки таблицы достаточно одной строки: df = pandas.read_excel("данные.xlsx"). Однако важно учитывать параметры: sheet_name (имя или индекс листа), usecols (указание столбцов), skiprows (пропуск строк в начале). Например, чтобы прочитать только столбцы A и C с третьей строки, используется: read_excel("файл.xlsx", usecols="A,C", skiprows=2).

При работе с большими файлами стоит отключать автоматическое определение типов: dtype=str позволяет избежать ошибок при смешанных данных в колонках. Для нестандартных Excel-файлов (например, с формулами или скрытыми листами) рекомендуется использовать openpyxl.load_workbook и работать напрямую с ячейками.

Если файл содержит несколько листов, pandas.read_excel может загрузить их все сразу, возвращая словарь DataFrame-ов: read_excel("мультилист.xlsx", sheet_name=None). Это особенно удобно при автоматической обработке отчетов, сгенерированных бухгалтерскими или ERP-системами.

Чтение Excel с помощью Python – это не просто альтернатива ручному копированию, а полноценный инструмент автоматизации, позволяющий обрабатывать большие объемы данных с высокой точностью и контролем над структурой документа.

Выбор библиотеки: pandas, openpyxl или xlrd?

pandas – оптимальный выбор при работе с табличными данными. Метод read_excel() автоматически обрабатывает типы данных, поддерживает фильтрацию, агрегацию и преобразование. Под капотом использует openpyxl для файлов .xlsx и xlrd для .xls. Поддержка .xls через xlrd ограничена: версии начиная с 2.0.1 работают только с .xls, а не с .xlsx.

openpyxl следует использовать, если требуется доступ к структуре документа: формулы, стили, диаграммы, слияние ячеек. openpyxl.load_workbook() даёт полный контроль над ячейками. Однако для анализа данных он менее удобен: нет встроенных функций группировки или фильтрации.

xlrd подходит исключительно для чтения .xls. Поддержка .xlsx была удалена после версии 1.2.0. Устаревшая архитектура, отсутствие поддержки современных форматов делает его выбором лишь в случае работы с архивными файлами Excel 97-2003.

Если задача – извлечь и обработать данные из Excel – используйте pandas совместно с openpyxl. Если требуется манипулировать содержимым и структурой документа, выбирайте openpyxl. xlrd применим только в специфических случаях, связанных со старыми файлами .xls.

Загрузка Excel-файла с помощью pandas.read_excel()

Для чтения данных из Excel-файла используйте функцию pandas.read_excel(), которая поддерживает как формат .xls, так и .xlsx. Убедитесь, что установлен пакет openpyxl или xlrd в зависимости от версии Excel-файла. Для файлов .xlsx рекомендуется использовать openpyxl, передав его явно через параметр engine.

Пример базовой загрузки:

import pandas as pd
df = pd.read_excel('данные.xlsx', engine='openpyxl')

Если файл содержит несколько листов, используйте параметр sheet_name. Для загрузки конкретного листа:

df = pd.read_excel('данные.xlsx', sheet_name='Отчет')

Для чтения всех листов сразу установите sheet_name=None. В этом случае результатом будет словарь, где ключи – названия листов:

all_sheets = pd.read_excel('данные.xlsx', sheet_name=None)

Если заголовки находятся не в первой строке, используйте параметр header. Например, чтобы задать заголовок на пятой строке:

df = pd.read_excel('данные.xlsx', header=4)

Параметр usecols позволяет ограничить загрузку до нужных столбцов. Указывайте диапазон в Excel-стиле или список имен:

df = pd.read_excel('данные.xlsx', usecols='A:C')

Чтобы ускорить загрузку больших файлов, отключите автоматическое определение типов, установив dtype=str. Это особенно полезно при нестабильной структуре столбцов:

df = pd.read_excel('данные.xlsx', dtype=str)

Для обработки отсутствующих значений используйте параметр na_values. Например:

df = pd.read_excel('данные.xlsx', na_values=['N/A', 'нет данных'])

Указание листа Excel-файла: работа с именами и индексами

При работе с Excel-файлами через библиотеку pandas важно правильно указывать лист, с которого нужно считать данные. Это можно сделать двумя способами: по имени или по индексу.

  • Для указания имени листа используйте параметр sheet_name='ИмяЛиста' в функции read_excel(). Имена чувствительны к регистру и должны точно соответствовать оригиналу. Ошибка в одном символе приведёт к исключению ValueError.
  • Для выбора листа по порядковому номеру используйте sheet_name=0, где 0 – это первый лист. Индексация начинается с нуля. Такой способ полезен при работе с шаблонными файлами, где структура стабильна, но названия могут меняться.

Если необходимо определить доступные листы перед чтением, используйте:

import pandas as pd
xls = pd.ExcelFile('файл.xlsx')
print(xls.sheet_names)

Это вернёт список всех листов. Далее можно подставить нужное имя или индекс. При чтении нескольких листов одновременно используйте список:

df_dict = pd.read_excel('файл.xlsx', sheet_name=['Лист1', 'Лист2'])

Если указать sheet_name=None, pandas прочитает все листы и вернёт словарь с именами листов в качестве ключей.

  1. Для автоматизации стоит избегать жёстко заданных имён. Лучше использовать sheet_names и выбирать листы по известным позициям или шаблонам.
  2. При работе с файлами, созданными вручную, имена листов могут содержать пробелы и спецсимволы. Рекомендуется их предварительно нормализовать или использовать индекс.

Чтение только нужных столбцов и строк

Для извлечения конкретных данных из Excel-файла используйте аргументы usecols и nrows библиотеки pandas. Это ускоряет загрузку и уменьшает потребление памяти.

  • Выбор столбцов: укажите список названий или диапазон в usecols. Пример: usecols=['A', 'C', 'F'] или usecols='A:C,F'.
  • Выбор строк: используйте nrows для чтения определённого количества строк сверху. Пример: nrows=100 – только первые 100 строк.
  • Пропуск строк: параметр skiprows позволяет пропустить ненужные строки. Пример: skiprows=range(1, 10) пропустит строки 2–10.
  • Фильтрация после загрузки: примените df[df['Столбец'] == значение] для точной выборки, если критерии не зависят от позиции строк.

Чтение с фильтрацией:

import pandas as pd
df = pd.read_excel('данные.xlsx', usecols='B,D,F', skiprows=2, nrows=50)
df = df[df['Категория'] == 'A']

Если столбцы не имеют заголовков, используйте header=None и задайте имена вручную через names=.

df = pd.read_excel('данные.xlsx', usecols=[1, 3], header=None, names=['Имя', 'Возраст'])

Поддерживается чтение по условию из нескольких столбцов:

df = pd.read_excel('файл.xlsx', usecols='B:D')
df = df[(df['Статус'] == 'Активен') & (df['Сумма'] > 1000)]

Такой подход особенно полезен при работе с большими файлами, где нет необходимости загружать весь объём данных.

Обработка пустых ячеек и пропущенных значений

При работе с Excel-файлами с помощью библиотеки pandas, пустые ячейки автоматически интерпретируются как NaN. Это поведение удобно для последующей фильтрации и обработки.

Чтобы проверить наличие пропущенных значений, используйте метод isnull() в сочетании с sum():

df.isnull().sum()

Удалить строки с пропущенными данными можно через dropna(). Параметр how='any' удалит строку при хотя бы одном NaN, how='all' – если все значения в строке отсутствуют:

df.dropna(how='any', inplace=True)

Если требуется заменить пропуски значениями по умолчанию, примените fillna(). Например, для числовых столбцов:

df['Сумма'] = df['Сумма'].fillna(0)

Для категориальных данных можно использовать наиболее частое значение:

df['Категория'] = df['Категория'].fillna(df['Категория'].mode()[0])

При чтении данных с помощью read_excel() важно указать, какие значения считать пропущенными. Это делается через параметр na_values:

df = pd.read_excel('данные.xlsx', na_values=['N/A', '-', 'нет данных'])

Если необходимо отличать ячейки, в которых отсутствует значение, от тех, где указано «0» или пустая строка, используйте параметр keep_default_na=False и задайте список значений вручную:

df = pd.read_excel('данные.xlsx', na_values=[''], keep_default_na=False)

Для поиска и анализа пропусков на уровне всей таблицы применяется метод info(). Он покажет, сколько непустых значений содержится в каждом столбце:

df.info()

Для выборочной обработки можно использовать маску на основе isnull() или notnull(). Например, чтобы вывести все строки с пропущенным значением в столбце 'Код':

df[df['Код'].isnull()]

Чтение нескольких листов из одного файла

Чтение нескольких листов из одного файла

Для работы с несколькими листами Excel-файла в Python, используется библиотека pandas, которая предоставляет удобный интерфейс для извлечения данных из различных листов. Чтобы прочитать несколько листов, можно передать список имен листов в параметр sheet_name функции pandas.read_excel().

Пример кода для чтения нескольких листов:

import pandas as pd
# Чтение данных с нескольких листов
sheets = pd.read_excel('файл.xlsx', sheet_name=['Лист1', 'Лист2'])
# Доступ к данным на каждом листе
df_лист1 = sheets['Лист1']
df_лист2 = sheets['Лист2']

В этом примере создается словарь, где ключи – это имена листов, а значения – это DataFrame, содержащие данные с этих листов. Такой подход позволяет эффективно работать с несколькими листами в одном файле.

Если нужно прочитать все листы в файле, можно использовать значение None для параметра sheet_name. В этом случае pandas вернет словарь, где ключи – имена листов, а значения – DataFrame для каждого листа.

# Чтение всех листов
all_sheets = pd.read_excel('файл.xlsx', sheet_name=None)
# Доступ к данным по имени листа
df_лист1 = all_sheets['Лист1']
df_лист2 = all_sheets['Лист2']

Для работы с большими файлами или при наличии множества листов полезно использовать параметры usecols и nrows, чтобы ограничить количество читаемых данных. Это поможет сократить время загрузки и снизить потребление памяти.

Пример с ограничением количества столбцов и строк:

df_лист1 = pd.read_excel('файл.xlsx', sheet_name='Лист1', usecols='A:C', nrows=100)

Таким образом, использование pandas для чтения нескольких листов из одного Excel-файла позволяет гибко и эффективно работать с данными, минимизируя избыточные операции и улучшая производительность.

Импорт Excel с нестандартной структурой (заголовки не в первой строке)

При работе с Excel файлами, где заголовки находятся не в первой строке, стандартный метод импорта данных с помощью библиотеки pandas может не подойти. В таких случаях необходимо указать нужную строку, содержащую заголовки, при чтении файла.

Для решения этой задачи используется параметр header функции pandas.read_excel(). Этот параметр позволяет указать номер строки, которая будет использована как заголовки. Нумерация строк начинается с нуля, что важно учитывать при указании нужной строки.

Пример использования:

import pandas as pd
data = pd.read_excel('data.xlsx', header=2)  # Заголовки находятся в третьей строке

В приведенном примере header=2 указывает на то, что заголовки данных находятся в третьей строке файла. Если строки с заголовками могут быть не единственными, можно использовать параметр skiprows, чтобы пропустить лишние строки до нужной.

Если в Excel-файле есть несколько строк с заголовками, можно использовать параметр header с списком номеров строк, чтобы объединить их в один заголовок:

data = pd.read_excel('data.xlsx', header=[0, 1])  # Заголовки в первых двух строках

Такой подход полезен для файлов, в которых столбцы могут быть объединены или содержат вложенные заголовки, например, для многослойных данных.

В случае, когда заголовки расположены в строках, которые идут после первых нескольких строк, параметр skiprows позволяет пропускать ненужные строки перед тем, как перейти к нужному месту. Это можно использовать, если структура документа сложная и требует предварительной фильтрации данных:

data = pd.read_excel('data.xlsx', skiprows=3, header=0)  # Пропускаем первые 3 строки

Используя эти методы, можно адаптировать процесс импорта данных из Excel для работы с нестандартными структурами и избежать проблем с неправильным интерпретированием данных.

Работа с Excel-файлами, защищёнными паролем

Работа с Excel-файлами, защищёнными паролем

Для начала необходимо установить нужные библиотеки. Например, для msoffcrypto-tool это можно сделать с помощью команды:

pip install msoffcrypto-tool

После установки, чтобы извлечь данные из зашифрованного файла, используется следующий код:


import msoffcrypto
import io
# Открываем зашифрованный файл
with open("file.xlsx", "rb") as file:
office_file = msoffcrypto.OfficeFile(file)
office_file.load_key(password="your_password")  # Указываем пароль
decrypted = io.BytesIO()
office_file.decrypt(decrypted)
# Теперь можно работать с расшифрованным содержимым
from openpyxl import load_workbook
decrypted.seek(0)
wb = load_workbook(decrypted)
sheet = wb.active

Данный подход позволяет работать с Excel-файлами, защищёнными паролем, после их расшифровки в памяти, что исключает необходимость сохранения промежуточных файлов на диск.

Для чтения защищённых файлов в формате XLSB, можно использовать библиотеку pyxlsb, которая также не требует расшифровки на уровне файловой системы, но ограничена поддержкой только для файлов в формате .xlsb. Пример кода:


from pyxlsb import open_workbook
with open_workbook('file.xlsb', password='your_password') as wb:
with wb.get_sheet(0) as sheet:
for row in sheet.rows():
print(row)

Важно помнить, что использование пароля – это не единственный фактор безопасности. Для защиты данных в Excel-файлах следует учитывать и другие аспекты, такие как криптографическая стойкость пароля и надежность используемых библиотек.

Вопрос-ответ:

Ссылка на основную публикацию