training-web.ruГлавнаяКатегорииО насКарта сайтаПоискТёмная тема

Категории

Как распарсить csv-файл модуль csv Python

Создано: 30 сентября 2017Автор: Егор Астапов7657 просмотровСложность: легкий

В прошлой статье: как записать данные в 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'}]
'''

Комментарии

реклама