CSV (Comma Separated Values) — один из ключевых форматов, который используется во многих областях, начиная от финансовых отчетов и заканчивая анализом данных. Понимание работы с CSV в Python не только расширит ваши навыки, но и позволит автоматизировать множество задач, связанных с данными.
Заказчикам на фриланс-биржах часто требуется сохранять результаты именно в одном из популярных форматов: CSV или JSON.
Формат данных в CSV выглядит так (может иметь любой разделитель):
one;two;three
Работа с модулем CSV очень проста, и нам понадобится запомнить лишь пару приемов для того, чтобы успешно применять его на практике.
Python предоставляет встроенную библиотеку csv, которая упрощает чтение и запись данных в формате CSV. Вот пример того, как вы можете прочитать данные из CSV-файла:
Для начала, нам нужно знать что любой список легко превратить в CSV
import csv
lst = ['one', 'two', 'three']
with open('res.csv', 'w', newline='', encoding='utf-8-sig') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow(lst)
Чтобы в Excel корректно открывалась кодировка, используйте encoding=’utf-8-sig’.
В результате выполнения этого кода будет создан файл res.csv, в который будет записан наш список lst, в каждой ячейке — элемент списка.
newline= — необходимо указывать всегда. Если не указать, то новые строки могут интерпретироваться неправильно и весь документ «сползет»;
encoding=’utf-8-sig’ — open() использует для открытия .csv по умолчанию кодировку unicode. Чтобы получить файл с необходимой нам кодировкой, нужно явно указывать ее.
writer = csv.writer(file, delimiter=';')
в этой строке мы с помощью фабричной функции csv.writer() создали объект _csv.writer для записи данных в формате CSV. У _csv.writer есть метод writerow(), с помощью которого можно записывать список в соответствующий формат построчно. delimiter=’;’ указывает, каким будет разделитель между элементами списка, мы можем указать любой.
Пример сбора данных с сохранением в формате .csv
import csv
import requests
from bs4 import BeautifulSoup
# 1 ------------------------------------------------------
with open('res.csv', 'w', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow([
'Наименование', 'Артикул', 'Бренд', 'Модель',
'Тип', 'Игровая', 'Размер', 'Разрешение', 'Подсветка',
'Сайт производителя', 'В наличии', 'Цена'])
# 1 ------------------------------------------------------
# 2 ------------------------------------------------------
url = 'https://mob25.com/'
response = requests.get(url=url)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
# 2 ------------------------------------------------------
# 3 ------------------------------------------------------
name = soup.find('p', id='p_header').text
article = soup.find('p', class_='article').text.split(': ')[1]
brand = soup.find('li', id='brand').text.split(': ')[1]
model = soup.find('li', id='model').text.split(': ')[1]
type = soup.find('li', id='type').text.split(': ')[1]
purpose = soup.find('li', id='purpose').text.split(': ')[1]
light = soup.find('li', id='light').text.split(': ')[1]
size = soup.find('li', id='size').text.split(': ')[1]
dpi = soup.find('li', id='dpi').text.split(': ')[1]
site = soup.find('li', id='site').text.split(': ')[1]
in_stock = soup.find('span', id='in_stock').text.split(': ')[1]
price = soup.find('span', id='price').text.split(' ')[0]
# 3 ------------------------------------------------------
# 4 ------------------------------------------------------
with open('res.csv', 'a', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow([
name, article, brand, model,
type, purpose, light, size, dpi,
site, in_stock, price])
# 4 ------------------------------------------------------
Код визуально разделен на 4 части.
В первом блоке мы создали файл res.csv и определили в нем первые 12 ячеек для заголовков. Наличие заголовков это хорошая практика, но не обязательная.
Вторая часть кода — это стандартные запросы к сайту, которые вы уже использовали при выполнении задач.
Третья часть хорошо показывает, что мы получаем нужные нам элементы и храним их в переменных, которые в 4-м пункте мы передаем в метод .writerow(). Обратите внимание на то, что мы передаем список.
И в результате выполнения 4-го блока кода мы получаем готовый файл .csv, в котором будут красиво лежать наши данные. Обратите внимание, что в 4-м блоке мы используем флаг ‘a’ для того, чтобы дописать созданный в первом блоке файл. ‘a’ («append») — добавление в конец. Если флаг будет ‘w’, — «write», то файл перезапишется заново и заголовки мы не увидим.