Рубрики
Без рубрики

Как разбирать электронную таблицу в Python

Иногда вам просто нужно разбирать электронную таблицу в Python. В этой статье мы осмотрим только как это сделать. Теги с Python, начинающими, учебниками, программированием.

Каждый раз в некоторое время у меня будет необходимость загружать данные из электронной таблицы в программу Python, но на один вопрос всегда подходит: какой лучший способ разбирать электронную таблицу в Python? Целью сегодняшней статьи является выяснение!

Проблема введения

Недавно я изучал библиотеку визуализации в Python под названием VTK, и мне нужно было найти способ визуализации некоторых данных из таблицы. К сожалению, у меня были две проблемы:

  • Я не знал, как читать электронную таблицу
  • Я не знал, как разбирать данные, которые я читаю

Другими словами, какие хорошие способы читать данные электронных таблиц? И какие хорошие способы смоделировать эти данные в программе Python?

Разборные файлы CSV

Этот первый вопрос будет целью этой статьи. В частности, мы смотрим различные способы чтения данных из файла CSV. Например, имеет смысл попытаться написать нашу собственную реализацию на анализ? В конце концов, CSV является одним из более легких форматов файлов для анализа (как видно ниже), и Python отлично подходит для работы с строками:

Name,Age,Favorite Color
Jeremy,25,Blue
Ally,41,Magenta
Jasmine,29,Aqua

Тем не менее, мы можем предпочесть использовать некоторые утилиты, предоставленные Python, как пакет CSV. Какой смысл изобретения колеса, когда есть библиотечная библиотека, построенная прямо на язык?

Как обычно, мы будем решать горстку решений и обсудим их плюсы и минусы. К концу этой статьи вы должны чувствовать себя комфортно, разбирающиеся файлы CSV.

Внутреннее представление

Что касается второго вопроса, у нас есть пара вариантов. Для начала мы могли интерпретировать электронную таблицу как гигантский список списков. В этом примере мы могли бы дать каждую строку данных свой список и хранить эти строки в списке:

# Heading: Name, Age, Favorite Color
csv_matrix = [
  ["Jeremy", 25, "Blue"],
  ["Ally", 41, "Magenta"],
  ["Jasmine", 29, "Aqua"]
]

Кроме того, мы могли бы дать каждому столбцу данных их собственным списком и хранить эти списки в списке:

# Heading: Name, Age, Favorite Color
csv_matrix = [
  ["Jeremy", "Ally", "Jasmine"],
  [25, 41, 29],
  ["Blue", "Magenta", "Aqua"]
]

В любом случае у нас будет гигантская матрица данных, которые будут тесно напоминать исходный файл CSV.

Конечно, я немного частично для словарей, поэтому я хотел бы использовать один из них. Например, что останавливает нас от создания словаря, где каждый ключ предоставляет нам целый столбец данных?

csv_dict = {
  "Name": ["Jeremy", "Ally", "Jasmine"],
  "Age": [25, 41, 29],
  "Favorite Color": ["Blue", "Magenta", "Aqua"]
}

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

csv_mapping_list = [
  {
    "Name": "Jeremy",
    "Age": 25,
    "Favorite Color": "Blue"
  },
  {
     "Name": "Ally",
     "Age": 41,
     "Favorite Color": "Magenta"
  },
  {
    "Name": "Jasmine",
    "Age": 29,
    "Favorite Color": "Aqua"
  }
]

Лично я предпочитаю это последнее представление, потому что образцы данных паятся вместе. Другими словами, нет риска искажения исходных данных, установленных во время действий, таких как сортировка. Между тем, остальные три представления имеют независимые списки, которые должны быть сортированы вместе. Этого достаточно, чтобы дать это последнее представительство победа.

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

Растворы

Как всегда, мы охватим горстку общих решений сегодняшней проблемы. Не стесняйтесь захватить то, что вам нужно, и бегите, но рекомендую прочитать через плюсы и минусы каждого решения. В конце концов, вы никогда не узнаете, когда некоторые из этого могут быть полезны.

Разобрать электронную таблицу с грубой силой

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

  • Строка заголовка
  • Кончики линии
  • Разделитель (в этом случае запятая)

В нашем оригинальном примере у нас была электронная таблица, которая выглядела что-то вроде следующего:

Name,Age,Favorite Color
Jeremy,25,Blue
Ally,41,Magenta
Jasmine,29,Aqua

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

csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
  line_count = 0
  for line in my_data:
    row_list = [val.strip() for val in line.split(",")]
    if line_count == 0:
      header = row_list
    else:
      row_dict = {}
      for i, key in enumerate(header):
        row_dict[key] = row_list[i]
      csv_mapping_list.append(row_dict)
    line_count += 1

Вот моя очень грубая попытка разбирать электронную таблицу вручную. В этом примере мы открываем CSV и прочитайте его линию по линии. Для каждой строки мы разделяем его запятой и систематически обрезаем каждое значение с помощью понимания списка.

Оттуда мы решаем, что линия, которую мы просто проанализировали, – это заголовок или нет. Если это так, мы сохраняем его значение для позже. В противном случае мы повторяем ряд значений и составьте их в словаре, используя заголовок. Я полагаю, это могло быть проще, чтобы использовать один из методов из нашего Как преобразовать два списка в словаре в Python статья:

csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
  line_count = 0
  for line in my_data:
    row_list = [val.strip() for val in line.split(",")]
    if line_count == 0:
      header = row_list
    else:
      row_dict = {key: value for key, value in zip(header, row_list)}
      csv_mapping_list.append(row_dict)
    line_count += 1

В любом случае этот раствор оставляет много места для модификации. Например, если ваш файл имеет какой-то другой вид разделителя, это может быть решение для вас.

Тем не менее, осознайте, что решение Brute Form имеет большой недостаток. По словам Юха-Матти Сантала Разделение запятой может потерпеть неудачу, если один из строк содержит текст с запятой в нем (т.е. "Грифски, Джереми", 25, синий ). Чтобы сделать все усилия, эта проблема меняется в зависимости от того, какой разделитель вы используете. К счастью, есть лучшие решения, чтобы следовать!

Разбирайте электронную таблицу с CSV Объект читателя

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

import csv
csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
  csv_reader = csv.reader(my_data, delimiter=",")
  line_count = 0
  for line in csv_reader:
     if line_count == 0:
       header = line
     else:
       row_dict = {key: value for key, value in zip(header, line)}
       csv_mapping_list.append(row_dict)
     line_count += 1

С объектом читателя нам не удалось упростить наш код. На самом деле, все, что мы сделали, было заменить понимание списка с институционацией читателя. Независимо от того, это хороший вариант для тех, кто предпочел бы не писать собственным парсером.

Разбор электронной таблицы с объектом Dictreader CSV

На данный момент вы, вероятно, задаетесь вопросом, почему мы даже использовали библиотеку CSV. В конце концов, он едва изменил в последних двух примерах. К счастью, есть способ уменьшить наш код немного, используя специальный класс в библиотеке CSV, называемой Dictreader:

import csv
with open("/path/to/dict.csv") as my_data:
  csv_mapping_list = list(csv.DictReader(my_data))

И, там у нас есть! Все разборы, которые мы сделали в первых двух разделах, теперь резко сокращаются до 3 строк кода.

Тем не менее, в этом решении в этом решении есть незначительное различие. Вместо того, чтобы создать список словарей, мы создали список ЗаказДикт объекты. Их можно использовать как словари, но их ключевой порядок исправлен. Независимо от того, элегантность этого решения должна более чем составлять на этот факт, и в некоторых случаях мы даже хотим сохранить ключевой порядок.

Немного повтора

На данный момент я приятно посмотреть на все потенциальные решения одновременно:

# Brute force solution
csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
  line_count = 0
  for line in my_data:
    row_list = [val.strip() for val in line.split(",")]
    if line_count == 0:
      header = row_list
    else:
      row_dict = {key: value for key, value in zip(header, row_list)}
      csv_mapping_list.append(row_dict)
    line_count += 1

# CSV reader solution
import csv
csv_mapping_list = []
with open("/path/to/data.csv") as my_data:
  csv_reader = csv.reader(my_data, delimiter=",")
  line_count = 0
  for line in csv_reader:
     if line_count == 0:
       header = line
     else:
       row_dict = {key: value for key, value in zip(header, line)}
       csv_mapping_list.append(row_dict)
     line_count += 1

# CSV DictReader solution
import csv
with open("/path/to/dict.csv") as my_data:
  csv_mapping_list = list(csv.DictReader(my_data))

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

Оригинал: “https://dev.to/renegadecoder94/how-to-parse-a-spreadsheet-in-python-4ag5”