Пару дней назад я работал над проектом, который включал значительное количество данных о погоде для нескольких разных городов США. После загрузки данных для всех городов и сохранения их в виде файлов CSV (значения, разделенные запятыми) я понял, что мне нужно прочитать все эти наборы данных, чтобы объединить их с дополнительными данными, которые я собрал для каждого из городов.

Простой, хотя и более трудоемкий способ сделать это - написать несколько строк кода для чтения и присвоить каждому файлу индивидуальное имя. Однако я хотел найти более эффективный способ решения этой проблемы.

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

Первое решение, с которым я столкнулся, использовало встроенную функцию Python exec, которая позволяет выполнять строку текста, как если бы это была строка кода. В этом случае я мог запустить:

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

Второе, более подходящее для Pythonic решение, которое я нашел, заключалось в использовании типа данных Python dictionary.

Словари - это фантастически универсальный тип данных, использующий пары ключ-значение, где значения могут включать практически любой тип данных в Python. Как и списки (другой тип данных Python), словари изменяемы, поэтому значения можно изменять или добавлять. Однако словари отличаются от списков тем, что доступ к элементам осуществляется с помощью ключей, а не порядковых номеров. Таким образом, словари очень похожи на их тезки (сравнение, которое я осознал только после того, как студент предложил мне его) - вы ищете определение (значение) слова (ключа), и для этого вам необходимо выполните поиск слова в словаре, чтобы найти соответствующее ему определение. Точно так же вы не можете искать в словаре определение, не зная связанного слова.

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

Несмотря на то, что я знал, что словари могут содержать различные типы данных, я еще не пробовал использовать их для хранения фреймов данных - типа данных Pandas, который напоминает электронную таблицу Excel, обычно используемую для хранения данных, импортированных из файлов CSV или Excel. Объединив возможность создавать новые ключи в словаре, просто ссылаясь на ключ, который еще не существует, с функцией Pandas read_csv (), словарное решение позволяет считывать и хранятся в том же объекте, откуда они позже могут быть вызваны с помощью своего уникального ключа.

Решение по словарю для чтения сразу всех данных выглядит так:

Намного приятнее. Теперь вместо того, чтобы иметь дело с n-многими объектами (по одному для каждого набора данных), у меня теперь есть единственный словарь, содержащий все фреймы данных, и я могу получить к ним доступ с помощью того же метода for city in city_dict, который использовался для хранить их.

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

Я мог бы весь день говорить о своей любви к словарям, так что пока оставлю это здесь.