Модуль csv дает программисту возможность выполнять структурный анализ файлов CSV (Comma Separated Values – переменные, разделенные запятыми). Файл CSV – это текстовый файл, в котором каждая строка имеет несколько полей, разделенных запятыми, или другими разделителями. Вы можете рассматривать каждую строчку как ряд, а каждое поле — как столбец. Формат CSV не имеет стандарта, но эти файлы достаточно похожи, так что модуль csv может распознавать большую часть этих файлов. Вы также можете создавать файлы CSV, используя данный модуль.
Чтение файлов CSV
Существует два способа чтения файлов CSV. Вы можете использовать функцию чтения модуля csv, или использовать класс DictReader. Мы рассмотрим оба метода. Но сначала, нам нужно получить файлы CSV, чтобы было над чем работать. В интернете есть много сайтов, предлагающих познавательную информацию в формате CSV. Мы используем сайт всемирной организации здравоохранения, чтобы скачать кое-какую информацию о туберкулёзе. Вы можете получить её здесь: http://www.who.int/tb/country/data/download/en/
Как только вы скачаете файл, мы будем готовы начать. Готовы? Давайте взглянем на следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import csv def csv_reader(file_obj): """ Read a csv file """ reader = csv.reader(file_obj) for row in reader: print(" ".join(row)) if __name__ == "__main__": csv_path = "TB_data_dictionary_2014-02-26.csv" with open(csv_path, "r") as f_obj: csv_reader(f_obj) |
Вот здесь мы остановимся. В первую очередь, нам нужно импортировать модуль csv. После этого, нам нужно создать очень простую функцию, под названием csv_reader, которая получает доступ к объекту файла. Внутри функции, мы передаем файл функции csv.reader, которая возвращает объект-считыватель. Объект-считыватель позволяет выполнить итерацию также, как это делает обычный объект file.
Это позволяет выполнять итерацию над каждым рядом в объекте-считывателе и отобразить строку данных, но без запятых. Это работает по той причине, что каждый ряд является списком, и мы можем объединить все элементы в списке вместе, создав одну большую строку. А теперь мы создадим наш собственный файл CSV и загрузим его в класс DictReader. Вот очень простой пример:
1 2 3 4 |
first_name,last_name,address,city,state,zip_code 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. Давайте попробуем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import csv def csv_dict_reader(file_obj): """ Read a CSV file using csv.DictReader """ reader = csv.DictReader(file_obj, delimiter=',') for line in reader: print(line["first_name"]), print(line["last_name"]) if __name__ == "__main__": with open("data.csv") as f_obj: csv_dict_reader(f_obj) |
В данном примере мы открыли файл и привязали объект файла к нашей функции таким же образом, каким мы делали это раньше. Функция привязывает наш объект к нашему классу DictReader. Мы указываем классу DictReader, что разделителем является запятая. Не то, что бы это было необходимо в нашем коде, так как он работает и без этого аргумента. Тем не менее, это хорошая идея, так как это позволяет пролить свет на то, что именно происходит внутри кода. Далее, мы применяем цикл над объектом-считывателем, и обнаруживаем, что каждая строка в нем – это словарь. Это упрощает печать отдельных фрагментов линии. Теперь мы готовы научиться писать файл csv на диск.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Пишем CSV файл
Модуль csv также имеет два метода, которые вы можете применять для написания файла CSV. Вы можете использовать функцию writer, или класс DictWriter. Мы рассмотрим оба метода. Начнем с функции writer. Давайте взглянем на простой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import csv def csv_writer(data, path): """ Write data to a CSV file path """ with open(path, "w", newline='') as csv_file: writer = csv.writer(csv_file, delimiter=',') for line in data: writer.writerow(line) if __name__ == "__main__": data = ["first_name,last_name,city".split(","), "Tyrese,Hirthe,Strackeport".split(","), "Jules,Dicki,Lake Nickolasville".split(","), "Dedric,Medhurst,Stiedemannberg".split(",") ] path = "output.csv" csv_writer(data, path) |
В данном коде мы создали функцию csv_writer которая принимает два аргумента: path и data. «data» — это список списков, которые мы создали внизу скрипта. Мы использовали сокращенную версию аргумента data из предыдущего примера и разделили строки запятыми. Это возвращает список. Таким образом, мы получаем вложенный список, который выглядит следующим образом:
1 2 3 4 |
[['first_name', 'last_name', 'city'], ['Tyrese', 'Hirthe', 'Strackeport'], ['Jules', 'Dicki', 'Lake Nickolasville'], ['Dedric', 'Medhurst', 'Stiedemannberg']] |
Функция csv_writer открывает путь, по которому мы проходим, и создает объект записи csv. После этого мы используем цикл в нашем вложенном списке, и записываем каждую строку на наш диск. Обратите внимание на то, что мы указали на то, какой именно символ является разделителем, когда создавали объект записи. Если вы хотите, чтобы разделителем была не запятая, а любой другой символ – это именно та самая часть, в которой вы можете это указать.
Теперь мы готовы к тому, чтобы научиться писать файлы CSV при помощи класса DictWriter. Мы используем аргумент data из предыдущего примера, и превратим его в список словарей, которые мы можем загрузить в наш DictWriter. Давайте взглянем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import csv def csv_dict_writer(path, fieldnames, data): """ Writes a CSV file using DictWriter """ with open(path, "w", newline='') as out_file: writer = csv.DictWriter(out_file, delimiter=',', fieldnames=fieldnames) writer.writeheader() for row in data: writer.writerow(row) if __name__ == "__main__": data = ["first_name,last_name,city".split(","), "Tyrese,Hirthe,Strackeport".split(","), "Jules,Dicki,Lake Nickolasville".split(","), "Dedric,Medhurst,Stiedemannberg".split(",") ] my_list = [] fieldnames = data[0] for values in data[1:]: inner_dict = dict(zip(fieldnames, values)) my_list.append(inner_dict) path = "dict_output.csv" csv_dict_writer(path, fieldnames, my_list) |
Начнем со второй части. Как вы видите, мы начали со структуры вложенного списка, который у нас был ранее. Теперь мы создаем пустой список и список, который содержит имена полей, который будет первым списком во вложенном списке. Помните, списки начинаются с нуля, так что первый элемент в нем начинается с нуля. Далее мы используем цикл во вложенном списке, начиная со второго элемента:
1 2 3 |
for values in data[1:]: inner_dict = dict(zip(fieldnames, values)) my_list.append(inner_dict) |
Внутри цикла for мы используем встроенные инструменты Python, чтобы создать словарь. Метод zip будет использовать два итератора (списка, в нашем случае), и превратит их в список кортежей. Давайте взглянем на пример:
1 2 |
zip(fieldnames, values) [('first_name', 'Dedric'), ('last_name', 'Medhurst'), ('city', 'Stiedemannberg')] |
Теперь, когда вы оборачиваете этот вызов в dict, этот список кортежей превращается в словарь. И наконец, мы добавляем словарь в список. Когда for завершит работу, вы получите структуру данных, которая будет выглядеть так:
1 2 3 4 5 |
[ {‘city’: ‘Strackeport’, ‘first_name’: ‘Tyrese’, ‘last_name’: ‘Hirthe’}, {‘city’: ‘Lake Nickolasville’, ‘first_name’: ‘Jules’, ‘last_name’: ‘Dicki’}, {‘city’: ‘Stiedemannberg’, ‘first_name’: ‘Dedric’, ‘last_name’: ‘Medhurst’} ] |
В конце второй сессии, мы вызываем нашу функцию csv_dict_writer и передаем ей все необходимые аргументы. Внутри функции мы создаем экземпляр DictWriter и передаем ей объекту файла, значение разделителя и наш список наименований полей. Далее, мы записываем наименования полей на наш диск, зацикливаем данные по одной строке за раз, и записываем данные на диск. Класс DictWriter также поддерживает метод writerows, который мы можем использовать вместо цикла. Функция csv.writer также может делать это. Вы, может быть, заинтересованы в том, что бы научиться создавать диалекты при помощи модуля csv. Это позволит вам указывать модулю csv, как именно читать или писать файл в очень простой форме. Если вам это нужно, так файл вашего клиента непонятно как отформатирован – вы найдете эту часть функционала просто незаменимой.
Подведем итоги
Теперь вы знаете, как использовать метод csv, а также научились читать и писать файлы в формате CSV. Существует великое множество сайтов, которые размещают свою информацию в этом формате, также он часто используется в сфере бизнеса.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»