Python очистить файл csv
Иногда возникают ситуации, когда надо произвести запись в файл, в котором уже находятся данные. Или просто удалить все содержимое. Рассмотрим, как выполнить очистку этого файла средствами Python 3.
Способы
Очистить файл в Python 3 можно следующими способами:
- При открытии использовать режим, в котором указатель находится в начале документа.
- Вручную переместить указатель в начальную позицию.
- Средствами операционной системы обнулить содержимое файла.
Рассмотрим эти варианты подробно.
При открытии
Когда файл открывается на запись, то указатель текущего положения в документе может быть расположен в начале или в конце документа. Если указатель в конце, то данные будут дописываться. Нас же интересует вариант, когда указатель расположен в начале.
Здесь w – указывает режим открытия файла на запись в текстовом режиме с размещением указателя в начале. После выполнения этого кода, если существовал указанный файл, то содержимое его очистится. Если его не было, то создастся новый пустой.
Перед закрытием, можно было добавить информацию. Она будет записана с начала файла, а не дописана в конец.
Если надо записывать данные в бинарный файл, то следует использовать режим “wb”.
Если же наоборот, нам нужно добавить информацию в конец файла. При этом старые данные чтобы остались. В этом случае к режиму следует добавить символ +. Режим открытия текстового документа будет “w+”, а бинарного “wb+”.
Дополнительную информацию по режимам открытия можно получить в отдельной статье на нашем сайте.
Перемещение указателя
Если мы открыли файл на запись и не знаем, в каком месте находится указатель. Возможно, мы уже записали какие то данные. Мы можем просто переместить указатель в начало и закрыть его. В этом случае документ будет пустым.
В этом примере открытие сделали специально в режиме дозаписи. После закрытия, даже если в файле были данные, они удалятся.
Вот еще пример, здесь мы записываем данные, потом переносим указатель в начало. После этого еще раз производим запись. В итоге, в конце работы, в файле будет только последняя сделанная запись. Те данные, которые были внесены вначале, благополучно удалятся.
Средствами ОС
Для очистки с помощью средств операционной системы воспользуемся стандартной библиотекой os. Вначале её надо подключить с помощью инструкции import os.
На linux должно пройти следующим образом.
Можно воспользоваться командами cp или cat. Вот пример решения с помощью cat.
Ни одна модель машинного обучения не выдаст осмысленных результатов, если вы предоставите ей сырые данные. После формирования выборки данных их необходимо очистить.
Очистка данных – это процесс обнаружения и исправления (или удаления) поврежденных или неточных записей из набора записей, таблицы или базы данных. Процесс включает в себя выявление неполных, неправильных, неточных или несущественных данных, а затем замену, изменение или удаление «загрязненных» данных.Определение очень длинное и не очень понятное :(
Чтобы детально во всем разобраться, мы разбили это определение на составные части и создали пошаговый гайд по очистке данных на Python. Здесь мы разберем методы поиска и исправления:
- отсутствующих данных;
- нетипичных данных – выбросов;
- неинформативных данных – дубликатов;
- несогласованных данных – одних и тех же данных, представленных в разных регистрах или форматах.
Для работы с данными мы использовали Jupyter Notebook и библиотеку Pandas.
Базой для наших экспериментов послужит набор данных по ценам на жилье в России, найденный на Kaggle. Мы не станем очищать всю базу целиком, но разберем на ее основе главные методы и операции.
Прежде чем переходить к процессу очистки, всегда нужно представлять исходный датасет. Давайте быстро взглянем на сами данные:
Этот код покажет нам, что набор данных состоит из 30471 строки и 292 столбцов. Мы увидим, являются ли эти столбцы числовыми или категориальными признаками.
Теперь мы можем пробежаться по чек-листу «грязных» типов данных и очистить их один за другим.
Работа с отсутствующими значениями – одна из самых сложных, но и самых распространенных проблем очистки. Большинство моделей не предполагают пропусков.
1.1. Как обнаружить?
Рассмотрим три метода обнаружения отсутствующих данных в наборе.
1.1.1. Тепловая карта пропущенных значений
Когда признаков в наборе не очень много, визуализируйте пропущенные значения с помощью тепловой карты.
Приведенная ниже карта демонстрирует паттерн пропущенных значений для первых 30 признаков набора. По горизонтальной оси расположены признаки, по вертикальной – количество записей/строк. Желтый цвет соответствует пропускам данных.
Заметно, например, что признак life_sq имеет довольно много пустых строк, а признак floor – напротив, всего парочку – около 7000 строки.
Карта отсутствующих данных
1.1.2. Процентный список пропущенных данных
Если в наборе много признаков и визуализация занимает много времени, можно составить список долей отсутствующих записей для каждого признака.
Такой список для тех же 30 первых признаков выглядит следующим образом:
Список недостающих данных % – первые 30 функций
У признака life_sq отсутствует 21% значений, а у floor – только 1%.
Этот список является полезным резюме, которое может отлично дополнить визуализацию тепловой карты.
1.1.3. Гистограмма пропущенных данных
Еще одна хорошая техника визуализации для наборов с большим количеством признаков – построение гистограммы для числа отсутствующих значений в записи.
Отсюда понятно, что из 30 тыс. записей более 6 тыс. строк не имеют ни одного пропущенного значения, а еще около 4 тыс.– всего одно. Такие строки можно использовать в качестве «эталонных» для проверки различных гипотез по дополнению данных.
Гистограмма пропущенных значений
1.2. Что делать с пропущенными значениями?
Не существует общих решений для проблемы отсутствующих данных. Для каждого конкретного набора приходится искать наиболее подходящие методы или их комбинации.
Разберем четыре самых распространенных техники. Они помогут в простых ситуациях, но, скорее всего, придется проявить творческий подход и поискать нетривиальные решения, например, промоделировать пропуски.
1.2.1. Отбрасывание записей
Первая техника в статистике называется методом удаления по списку и заключается в простом отбрасывании записи, содержащей пропущенные значения. Это решение подходит только в том случае, если недостающие данные не являются информативными.
Для отбрасывания можно использовать и другие критерии. Например, из гистограммы, построенной в предыдущем разделе, мы узнали, что лишь небольшое количество строк содержат более 35 пропусков. Мы можем создать новый набор данных df_less_missing_rows , в котором отбросим эти строки.
1.2.2. Отбрасывание признаков
Как и предыдущая техника, отбрасывание признаков может применяться только для неинформативных признаков.
В процентном списке, построенном ранее, мы увидели, что признак hospital_beds_raion имеет высокий процент недостающих значений – 47%. Мы можем полностью отказаться от этого признака:
1.2.3. Внесение недостающих значений
Для численных признаков можно воспользоваться методом принудительного заполнения пропусков. Например, на место пропуска можно записать среднее или медианное значение, полученное из остальных записей.
Для категориальных признаков можно использовать в качестве заполнителя наиболее часто встречающееся значение.
Возьмем для примера признак life_sq и заменим все недостающие значения медианой этого признака:
Одну и ту же стратегию принудительного заполнения можно применить сразу для всех числовых признаков:
К счастью, в нашем наборе не нашлось пропусков в категориальных признаках. Но это не мешает нам продемонстрировать использование той же стратегии:
1.2.4. Замена недостающих значений
Можно использовать некоторый дефолтный плейсхолдер для пропусков, например, новую категорию _MISSING_ для категориальных признаков или число -999 для числовых.
Таким образом, мы сохраняем данные о пропущенных значениях, что тоже может быть ценной информацией.
Выбросы – это данные, которые существенно отличаются от других наблюдений. Они могут соответствовать реальным отклонениям, но могут быть и просто ошибками.
2.1. Как обнаружить выбросы?
Для численных и категориальных признаков используются разные методы изучения распределения, позволяющие обнаружить выбросы.
2.1.1. Гистограмма/коробчатая диаграмма
Если признак численный, можно построить гистограмму или коробчатую диаграмму (ящик с усами). Посмотрим на примере уже знакомого нам признака life_sq .
Из-за возможных выбросов данные выглядят сильно искаженными.
Построение гистограммы для обнаружения выбросов
Чтобы изучить особенность поближе, построим коробчатую диаграмму.
Видим, что есть выброс со значением более 7000.
Построение коробчатой диаграммы для обнаружения выбросов
2.1.2. Описательная статистика
Отклонения численных признаков могут быть слишком четкими, чтобы не визуализироваться коробчатой диаграммой. Вместо этого можно проанализировать их описательную статистику.
Например, для признака life_sq видно, что максимальное значение равно 7478, в то время как 75% квартиль равен только 43. Значение 7478 – выброс.
outlier_describe.py
2.1.3. Столбчатая диаграмма
Для категориальных признаков можно построить столбчатую диаграмму – для визуализации данных о категориях и их распределении.
Например, распределение признака ecology вполне равномерно и допустимо. Но если существует категория только с одним значением "другое" , то это будет выброс.
outlier_barchart.py Построение столбчатой диаграммы для обнаружения выбросов
2.1.4. Другие методы
Для обнаружения выбросов можно использовать другие методы, например, построение точечной диаграммы, z-оценку или кластеризацию. В этом руководстве они не рассматриваются.
2.2. Что делать?
Выбросы довольно просто обнаружить, но выбор способа их устранения слишком существенно зависит от специфики набора данных и целей проекта. Их обработка во многом похожа на обработку пропущенных данных, которую мы разбирали в предыдущем разделе. Можно удалить записи или признаки с выбросами, либо скорректировать их, либо оставить без изменений.
Переходим к более простой части очистки данных – удалению мусора.
Вся информация, поступающая в модель, должна служить целям проекта. Если она не добавляет никакой ценности, от нее следует избавиться.
Три основных типа «ненужных» данных:
- неинформативные признаки с большим количеством одинаковых значений,
- нерелевантные признаки,
- дубликаты записей.
Рассмотрим работу с каждым типом отдельно.
Если признак имеет слишком много строк с одинаковыми значениями, он не несет полезной информации для проекта.
3.1. Как обнаружить?
Составим список признаков, у которых более 95% строк содержат одно и то же значение.
Теперь можно последовательно перебрать их и определить, несут ли они полезную информацию.
Список признаков с высоким процентом одинаковых значений
3.2. Что делать?
Если после анализа причин получения повторяющихся значений вы пришли к выводу, что признак не несет полезной информации, используйте drop() .
Нерелевантные признаки обнаруживаются ручным отбором и оценкой значимости. Например, признак, регистрирующий температуру воздуха в Торонто точно не имеет никакого отношения к прогнозированию цен на российское жилье. Если признак не имеет значения для проекта, его нужно исключить.
Если значения признаков (всех или большинства) в двух разных записях совпадают, эти записи называются дубликатами.
5.1. Как обнаружить повторяющиеся записи?
Способ обнаружения дубликатов зависит от того, что именно мы считаем дубликатами. Например, в наборе данных есть уникальный идентификатор id . Если две записи имеют одинаковый id , мы считаем, что это одна и та же запись. Удалим все неуникальные записи:
Получаем в результате 10 отброшенных дубликатов:
Обнаружение неуникальных записей по идентификатору
Другой распространенный способ вычисления дубликатов: по набору ключевых признаков. Например, неуникальными можно считать записи с одной и той же площадью жилья, ценой и годом постройки.
Найдем в нашем наборе дубликаты по группе критических признаков – full_sq , life_sq , floor , build_year , num_room , price_doc :
Получаем в результате 16 дублирующихся записей:
Обнаружение дубликатов по набору ключевых признаков
5.2. Что делать с дубликатами?
Очевидно, что повторяющиеся записи нам не нужны, значит, их нужно исключить из набора.
Вот так выглядит удаление дубликатов, основанное на наборе ключевых признаков:
В результате новый набор df_dedupped2 стал короче на 16 записей.
Результат отбрасывания дубликатов записей
Большая проблема очистки данных – разные форматы записей. Для корректной работы модели важно, чтобы набор данных соответствовал определенным стандартам – необходимо тщательное исследование с учетом специфики самих данных. Мы рассмотрим четыре самых распространенных несогласованности:
- Разные регистры символов.
- Разные форматы данных (например, даты).
- Опечатки в значениях категориальных признаков.
- Адреса.
Непоследовательное использование разных регистров в категориальных значениях является очень распространенной ошибкой, которая может существенно повлиять на анализ данных.
6.1. Как обнаружить?
Давайте посмотрим на признак sub_area :
В нем содержатся названия населенных пунктов. Все выглядит вполне стандартизированным:
Записи с разным регистром символов
Но если в какой-то записи вместо Poselenie Sosenskoe окажется poselenie sosenskoe , они будут расценены как два разных значения.
6.2. Что делать?
Эта проблема легко решается принудительным изменением регистра:
string_lower_case2.py Приведение всех символов к нижнему регистру
Ряд данных в наборе находится не в том формате, с которым нам было бы удобно работать. Например, даты, записанные в виде строки, следует преобразовать в формат DateTime .
7.1. Как обнаружить?
Признак timestamp представляет собой строку, хотя является датой:
string_to_datetime1.py
7.2. Что же делать?
Чтобы было проще анализировать транзакции по годам и месяцам, значения признака timestamp следует преобразовать в удобный формат:
string_to_datetime2.py Преобразование строк в даты
Опечатки в значениях категориальных признаков приводят к таким же проблемам, как и разные регистры символов.
8.1. Как обнаружить?
Для обнаружения опечаток требуется особый подход. В нашем наборе данных о недвижимости опечаток нет, поэтому для примера создадим новый набор. В нем будет признак city , а его значениями будут torontoo и tronto . В обоих случаях это опечатки, а правильное значение – toronto .
Простой способ идентификации подобных элементов – нечеткая логика или редактирование расстояния. Суть этого метода заключается в измерении количества букв (расстояния), которые нам нужно изменить, чтобы из одного слова получить другое.
Предположим, нам известно, что в признаке city должно находиться одно из четырех значений: toronto , vancouver , montreal или calgary . Мы вычисляем расстояние между всеми значениями и словом toronto (и vancouver ).
Те слова, в которых содержатся опечатки, имеют меньшее расстояние с правильным словом, так как отличаются всего на пару букв.
fuzzy_logic_distance.py Вычисление расстояния между словами для обнаружения опечаток
8.2. Что делать?
Мы можем установить критерии для преобразования этих опечаток в правильные значения.
Например, если расстояние некоторого значения от слова toronto не превышает 2 буквы, мы преобразуем это значение в правильное – toronto .
Исправление найденных опечаток
Адреса – ужасная головная боль для всех аналитиков данных. Ведь мало кто следует стандартному формату, вводя свой адрес в базу данных.
9.1. Как обнаружить?
Проще предположить, что проблема разных форматов адреса точно существует. Даже если визуально вы не обнаружили беспорядка в этом признаке, все равно стоит стандартизировать их для надежности.
В нашем наборе данных по соображениям конфиденциальности отсутствует признак адреса, поэтому создадим новый набор df_add_ex :
Признак адреса здесь загрязнен:
Значения адреса
9.2. Что делать?
Минимальное форматирование включает следующие операции:
- приведение всех символов к нижнему регистру;
- удаление пробелов в начале и конце строки;
- удаление точек;
- стандартизация формулировок: замена street на st , apartment на apt и т. д.
Теперь признак стал намного чище:
Стандартизация адресов
Мы сделали это! Это был долгий и трудный путь, но теперь все «грязные" данные очищены и готовы к анализу, а вы стали спецом по чистке данных ;)
У нас есть еще куча полезных статей по Data Science, например, среди недавних:
Это начало нового проекта, и вы рады применить некоторые модели машинного обучения.
Вы посмотрите на данные и быстро поймете, что этоабсолютный беспорядок,
Согласно сIBM Data AnalyticsВы можете ожидать потратить до80% вашего времени очистки данных,
В этом посте мы рассмотрим ряд различныхочистка данныхзадачи с использованием PythonБиблиотека панд, В частности, мы сосредоточимся на, вероятно, самой большой задаче очистки данных,пропущенные значения,
Прочитав этот пост, вы сможетеБольшебыстро очистить данные, Мы все хотимтратить меньше времени на очистку данныхи больше времени на изучение и моделирование.
Прежде чем мы углубимся в код, важно понять источники недостающих данных. Вот несколько типичных причин отсутствия данных:
- Пользователь забыл заполнить поле.
- Данные были потеряны при переносе вручную из устаревшей базы данных.
- Произошла ошибка программирования.
- Пользователи решили не заполнять поле, связанное с их мнением о том, как результаты будут использоваться или интерпретироваться.
Как видите, некоторые из этих источников - просто случайные ошибки. В других случаях может быть более глубокая причина, по которой данные отсутствуют.
Важно понимать этиразличные типы недостающих данныхсо статистической точки зрения. Тип пропущенных данных будет влиять на то, как вы справитесь с заполнением пропущенных значений.
Сегодня мы узнаем, как обнаруживать пропущенные значения, и сделаем некоторые основные вменения. Для подробного статистического подхода дляработа с недостающими даннымиПосмотрите эти удивительные слайды от ученого Мэтта Бремса.
Имейте в виду, что вменение со средним или средним значением, как правило, является плохой идеей, поэтому не забудьте проверить слайды Мэтта для правильного подхода.
Перед тем, как приступить к очистке набора данных, рекомендуется просто получить общее представление о данных. После этого вы можете составить план очистки данных.
Я хотел бы начать, задавая следующие вопросы:
- Каковы особенности?
- Какие ожидаемые типы (int, float, string, boolean)?
- Есть ли очевидные пропущенные данные (значения, которые Пандас может обнаружить)?
- Существуют ли другие типы пропущенных данных, которые не так очевидны (их нелегко обнаружить с помощью Pandas)?
Чтобы показать вам, что я имею в виду, давайте начнем работать с примером.
Данные, с которыми мы будем работать, очень малы.набор данных по недвижимости, Направляйтесь к нашемустраница GitHubвзять копиюCSV-файлтак что вы можете кодировать вместе.
Вот быстрый взгляд на данные:
Это намного меньший набор данных, чем тот, с которым вы обычно работаете. Несмотря на то, что это небольшой набор данных, он освещает множество реальных ситуаций, с которыми вы столкнетесь.
Хороший способ быстро оценить данные - взглянуть на первые несколько строк. Вот как вы бы это сделали в Pandas:
Я знаю, что сказал, что мы будем работать с Пандами, но вы можете видеть, что я также импортировал Numpy. Мы будем использовать это чуть позже, чтобы переименовать некоторые пропущенные значения, поэтому мы могли бы также импортировать его сейчас.
После импорта библиотек мы читаем файл csv в фрейм данных Pandas. Вы можете думать о кадре данных как о таблице.
С .head() Метод, мы можем легко увидеть первые несколько строк.
Теперь я могу ответить на мой оригинальный вопрос,каковы мои особенности?Из названий столбцов довольно легко определить следующие особенности:
- ST_NUM : Номер улицы
- ST_NAME : Название улицы
- OWN_OCCUPIED : Занят ли владелец резиденции
- NUM_BEDROOMS : Количество спален
Мы также можем ответить,Какие ожидаемые типы?
- ST_NUM : float или int . какой-то числовой тип
- ST_NAME : строка
- OWN_OCCUPIED : строка… Y («Да») или N («Нет»)
- NUM_BEDROOMS : float или int, числовой тип
Чтобы ответить на следующие два вопроса, нам нужно начать получать более глубокие панды ширины. Давайте начнем смотреть на примеры того, как обнаружить пропущенные значения
Итак, что я подразумеваю под «стандартными пропущенными значениями»? Это недостающие значения, которые Панды могут обнаружить.
Возвращаясь к нашему исходному набору данных, давайте посмотрим на столбец «Номер улицы».
В третьем ряду пустая клетка. В седьмом ряду есть значение «NA».
Очевидно, что оба эти значения отсутствуют. Давайте посмотрим, как Панды справляются с этим.
Взглянув на колонку, мы видим, что Панды заполнили пустое пространство «NA». Используя isnull() метод, мы можем подтвердить, что как пропущенное значение, так и «NA» были распознаны как пропущенные значения. Оба логических ответа True ,
Это простой пример, но он подчеркивает важный момент. Панды распознают как пустые ячейки, так и типы «NA» как пропущенные значения. В следующем разделе мы рассмотрим некоторые типы, которые Панды не распознают.
Иногда это может быть случай, когда пропущенные значения имеют разные форматы
Давайте посмотрим на колонку «Количество спален», чтобы понять, что я имею в виду.
В этом столбце есть четыре пропущенных значения.
Из предыдущего раздела мы знаем, что Панды распознают «NA» как отсутствующее значение, но как насчет других? Давайте взглянем.
Как и прежде, Панды признали «NA» отсутствующим значением. К сожалению, другие типы не были распознаны.
Если есть несколько пользователей, вводящих данные вручную, то это обычная проблема. Может быть, я хотел бы использовать «н / д», но вы хотели бы использовать «н».
Простой способ обнаружить эти различные форматы - поместить их в список. Затем, когда мы импортируем данные, Pandas сразу же распознает их. Вот пример того, как мы это сделаем.
Теперь давайте еще раз посмотрим на этот столбец и посмотрим, что произойдет.
На этот раз все различные форматы были признаны пропущенными значениями.
Возможно, вы не сможете поймать все это сразу. Когда вы работаете с данными и видите другие типы пропущенных значений, вы можете добавить их в список.
Важно распознавать эти нестандартные типы пропущенных значений для суммирования и преобразования пропущенных значений. Если вы попытаетесь посчитать количество пропущенных значений до преобразования этих нестандартных типов, вы можете в конечном итоге пропустить множество пропущенных значений.
В следующем разделе мы рассмотрим более сложный, но очень распространенный тип пропущенных значений.
До сих пор мы видели стандартные пропущенные значения и нестандартные пропущенные значения. Что если у нас неожиданный тип?
Например, если ожидается, что наша функция будет строкой, но имеет числовой тип, то технически это также пропущенное значение.
Давайте посмотрим на колонку «Владелец занят», чтобы понять, о чем я говорю.
Из наших предыдущих примеров мы знаем, что Панды обнаружат пустую ячейку в седьмой строке как отсутствующее значение. Давайте подтвердим с помощью некоторого кода.
В четвертой строке находится число 12. Ответ для Owner Occupied должен быть явно строкой (Y или N), поэтому этот числовой тип должен быть пропущенным значением.
Этот пример немного сложнее, поэтому нам нужно продумать стратегию обнаружения пропущенных значений этих типов. Есть несколько разных подходов, но вот способ, которым я собираюсь проработать этот.
- Цикл по столбцу OWN_OCCUPIED
- Попробуйте превратить запись в целое число
- Если запись может быть преобразована в целое число, введите пропущенное значение
- Если число не может быть целым числом, мы знаем, что это строка, поэтому продолжайте
Давайте посмотрим на код, а затем подробно рассмотрим его.
В коде мы перебираем каждую запись в столбце «Владелец занят». Чтобы попытаться изменить запись на целое число, мы используем int(row) ,
Если значение можно изменить на целое число, мы изменим запись на отсутствующее значение, используя Numpy's np.nan ,
С другой стороны, если это не может быть изменено на целое число, мы pass и продолжай.
Вы заметите, что я использовал try а также except ValueError , Это называетсяОбработка исключенийи мы используем это для обработки ошибок.
Другим важным фрагментом кода является .loc метод. Это предпочтительный метод Pandas для изменения записей на месте. Для получения дополнительной информации об этом вы можете проверитьДокументация панд,
Теперь, когда мы проработали различные способы обнаружения пропущенных значений, мы рассмотрим их обобщение и замену.
После того, как мы убрали пропущенные значения, мы, вероятно, захотим обобщить их. Например, мы можем посмотреть общее количество пропущенных значений для каждой функции.
В других случаях мы могли бы сделать быструю проверку, чтобы увидеть, есть ли у нас какие-либо пропущенные значения вообще.
Мы также можем получить общее количество пропущенных значений.
Теперь, когда мы суммировали количество пропущенных значений, давайте взглянем на несколько простых замен.
Часто вам придется выяснить, как вы хотите обрабатывать пропущенные значения.
Иногда вы просто хотите удалить эти строки, в других случаях вы их замените.
Как я упоминал ранее, это не следует воспринимать легкомысленно. Мы рассмотрим некоторые основные положения, но для подробного статистического подхода кработа с недостающими даннымиПосмотрите эти удивительные слайды от ученого Мэтта Бремса.
При этом, может быть, вы просто хотите заполнить пропущенные значения одним значением.
Скорее всего, вы можете сделать вменение на основе местоположения. Вот как ты это сделаешь.
Очень распространенный способ заменить пропущенные значения - использовать медиану.
Мы рассмотрели несколько простых способов заменить пропущенные значения, но не забудьте проверить слайды Мэтта для правильной техники
Работа с грязными данными неизбежна.Очистка данныхэто просто часть процесса в проекте науки о данных.
В этой статье мы рассмотрели некоторые способы обнаружения, обобщения и замены пропущенных значений.
Чтобы узнать больше об очистке данных, ознакомьтесь с этимикниги по науке о данных,
Вооружившись этими методами, вы будете тратить меньше времени на очистку данных, а также больше времени на изучение и моделирование.
Чтение файлов CSV
Вот здесь мы остановимся. В первую очередь, нам нужно импортировать модуль csv. После этого, нам нужно создать очень простую функцию, под названием csv_reader, которая получает доступ к объекту файла. Внутри функции, мы передаем файл функции csv.reader, которая возвращает объект-считыватель. Объект-считыватель позволяет выполнить итерацию также, как это делает обычный объект file.
Это позволяет выполнять итерацию над каждым рядом в объекте-считывателе и отобразить строку данных, но без запятых. Это работает по той причине, что каждый ряд является списком, и мы можем объединить все элементы в списке вместе, создав одну большую строку. А теперь мы создадим наш собственный файл CSV и загрузим его в класс DictReader. Вот очень простой пример:
Tyrese,Hirthe,1404 Turner Ville,Strackeport,NY,19106-8813 Jules,Dicki,2410 Estella Cape Suite 061,Lake Nickolasville,ME,00621-7435 Dedric,Medhurst,6912 Dayna Shoal,Stiedemannberg,SC,43259-2273Давайте сохраним это в файле, под названием data.csv . Теперь мы готовы проанализировать файл при помощи класса DictReader. Давайте попробуем:
В данном примере мы открыли файл и привязали объект файла к нашей функции таким же образом, каким мы делали это раньше. Функция привязывает наш объект к нашему классу DictReader. Мы указываем классу DictReader, что разделителем является запятая. Не то, что бы это было необходимо в нашем коде, так как он работает и без этого аргумента. Тем не менее, это хорошая идея, так как это позволяет пролить свет на то, что именно происходит внутри кода. Далее, мы применяем цикл над объектом-считывателем, и обнаруживаем, что каждая строка в нем – это словарь. Это упрощает печать отдельных фрагментов линии. Теперь мы готовы научиться писать файл csv на диск.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Пишем CSV файл
Модуль csv также имеет два метода, которые вы можете применять для написания файла CSV. Вы можете использовать функцию writer, или класс DictWriter. Мы рассмотрим оба метода. Начнем с функции writer. Давайте взглянем на простой пример:
Функция csv_writer открывает путь, по которому мы проходим, и создает объект записи csv. После этого мы используем цикл в нашем вложенном списке, и записываем каждую строку на наш диск. Обратите внимание на то, что мы указали на то, какой именно символ является разделителем, когда создавали объект записи. Если вы хотите, чтобы разделителем была не запятая, а любой другой символ – это именно та самая часть, в которой вы можете это указать.
Теперь мы готовы к тому, чтобы научиться писать файлы CSV при помощи класса DictWriter. Мы используем аргумент data из предыдущего примера, и превратим его в список словарей, которые мы можем загрузить в наш DictWriter. Давайте взглянем:
writer = csv . DictWriter ( out_file , delimiter = ',' , fieldnames = fieldnames )Начнем со второй части. Как вы видите, мы начали со структуры вложенного списка, который у нас был ранее. Теперь мы создаем пустой список и список, который содержит имена полей, который будет первым списком во вложенном списке. Помните, списки начинаются с нуля, так что первый элемент в нем начинается с нуля. Далее мы используем цикл во вложенном списке, начиная со второго элемента:
Внутри цикла for мы используем встроенные инструменты Python, чтобы создать словарь. Метод zip будет использовать два итератора (списка, в нашем случае), и превратит их в список кортежей. Давайте взглянем на пример:
[ ( 'first_name' , 'Dedric' ) , ( 'last_name' , 'Medhurst' ) , ( 'city' , 'Stiedemannberg' ) ]Теперь, когда вы оборачиваете этот вызов в dict, этот список кортежей превращается в словарь. И наконец, мы добавляем словарь в список. Когда for завершит работу, вы получите структуру данных, которая будет выглядеть так:
В конце второй сессии, мы вызываем нашу функцию csv_dict_writer и передаем ей все необходимые аргументы. Внутри функции мы создаем экземпляр DictWriter и передаем ей объекту файла, значение разделителя и наш список наименований полей. Далее, мы записываем наименования полей на наш диск, зацикливаем данные по одной строке за раз, и записываем данные на диск. Класс DictWriter также поддерживает метод writerows, который мы можем использовать вместо цикла. Функция csv.writer также может делать это. Вы, может быть, заинтересованы в том, что бы научиться создавать диалекты при помощи модуля csv. Это позволит вам указывать модулю csv, как именно читать или писать файл в очень простой форме. Если вам это нужно, так файл вашего клиента непонятно как отформатирован – вы найдете эту часть функционала просто незаменимой.
Подведем итоги
Теперь вы знаете, как использовать метод csv, а также научились читать и писать файлы в формате CSV. Существует великое множество сайтов, которые размещают свою информацию в этом формате, также он часто используется в сфере бизнеса.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
Читайте также: