В прошлой статье: как записать данные в csv-файл модуль csv Python я записывал данные в csv-файл. В этот статье проделаем обратное. Довольно часто нужно парсить csv-файлы. Файлы csv представляют собой текстовые файлы. Сами файлы csv состоят из строк. В каждой строке находятся значения разделённые разделителем :;|,. Парсинг таких csv-документов выглядит примерно одинаково. Мы должны прочесть построчно файл и разбить каждую строку по разделителю. Элементы разбитой строки - это то, что нужно. Я решил распарсить csv-файл output.csv.
name;name_last;lang
Ivan;Ivanov;PHP
Anton;Antonov;Javascript
Egor;Egorov;Python
Для парсинга я воспользовался модулем csv. Вы можете не пользоваться этим модулем, но вы усложните свою работу. Вы просто проделаете лишнюю работу. Функция reader модуля csv возвращает объект-считыватель reader. Данные в объекте reader выводил циклом for. Я получил строку name;name_last;lang. Эту строку нажно разбить по разделителю. Я воспользовался функцией split(';'). Разделитель вы должны определить сами. Вы можете почитать о функции split в статье как разбить строку по символу split Python. В каждом csv-файле свой разделитель. При помощи функции extend я добавлял в список данные. Список arr1 я помещал строки, а в список arr2 поместил списки в качестве значений.
# -*- coding: utf-8 -*-
import csv
filepath = r"D:\Egor\script\module\csv\output.csv"
arr1 = []
arr2 = []
with open(filepath, "r", newline="") as file:
#читаем файл целиком
reader = csv.reader(file)
'''
Циклом for проходим по строкам
'''
for row in reader:
cur_arr = row[0].split(';')
'''
В этом случае вы получите список значений
'''
arr1.extend(cur_arr)
'''
Тут получится список из списков.
Каждый добавленный блок является списком
'''
arr2.extend([cur_arr])
print(arr1)
print(arr2)
'''
вывод:
['name', 'name_last', 'lang', 'Ivan', 'Ivanov', 'PHP',\
'Anton', 'Antonov', 'Javascript', 'Egoe', 'Egorov', 'Python']
[['name', 'name_last', 'lang'], ['Ivan', 'Ivanov', 'PHP'],\
['Anton', 'Antonov', 'Javascript'], ['Egor', 'Egorov', 'Python']]
'''
Второй пример похож на первый, но есть небольшие отличия. Я использовал класс DictReader модуля csv. Переменная row имеет тип данных OrderedDict([('name', 'Ivan'), ('name_last', 'Ivanov'), ('lang', 'PHP')]). Вы можете проверить переменную при помощи функции type(). Если вы обратитесь к переменной по ключу row['name'] как к элементу словаря, то получите значения соответствующее этому ключу. В каком виде представить данные - решать вам! Решил сделать список из словарей. Для наполнения списка словарями использовал функцию append().
# -*- coding: utf-8 -*-
import csv
filepath = r"D:\Egor\script\module\csv\output.csv"
arr1 = []
arr2 = []
arr3 = []
with open(filepath, "r", newline="") as file:
reader = csv.DictReader(file, delimiter=';')
for row in reader:
print('name:',row['name'],'name_last:',row['name_last'],'lang:',row['lang'])
cur_arr = [row['name'], row['name_last'], row['lang']]
cur_dict = {'name': row['name'],'name_last': row['name_last'],'lang': row['lang']}
'''
В этом списке находятся строки в качестве значений
'''
arr1.extend(cur_arr)
'''
В этом списке находятся списки
'''
arr2.extend([cur_arr])
'''
В этом списке находятся списки
'''
arr3.append(cur_dict)
print(arr1)
print(arr2)
print(arr3)
'''
name: Ivan name_last: Ivanov lang: PHP
name: Anton name_last: Antonov lang: Javascript
name: Egor name_last: Egorov lang: Python
['Ivan', 'Ivanov', 'PHP', 'Anton', 'Antonov', 'Javascript', 'Egor', 'Egorov', 'Python']
[['Ivan', 'Ivanov', 'PHP'], ['Anton', 'Antonov', 'Javascript'], ['Egor', 'Egorov', 'Python']]
[{'name': 'Ivan', 'name_last': 'Ivanov', 'lang': 'PHP'},\
{'name': 'Anton', 'name_last': 'Antonov', 'lang': 'Javascript'},\
{'name': 'Egor', 'name_last': 'Egorov', 'lang': 'Python'}]
'''