Working with csv files python

Work with CSV files#

CSV (comma-separated value) — a tabular data format (for example, it may be data from a table or data from a database).

In this format, each line of a file is a line of a table. Despite format name the separator can be not only a comma. Formats with a different separator may have their own name, for example, TSV (tab separated values), however, the name CSV usually means any separators).

Example of a CSV file (sw_data.csv):

hostname,vendor,model,location sw1,Cisco,3750,London sw2,Cisco,3850,Liverpool sw3,Cisco,3650,Liverpool sw4,Cisco,3650,London 

The standard Python library has a csv module that allows working with files in CSV format.

Reading#

Example of reading a file in CSV format (csv_read.py file):

import csv with open('sw_data.csv') as f: reader = csv.reader(f) for row in reader: print(row) 
$ python csv_read.py ['hostname', 'vendor', 'model', 'location'] ['sw1', 'Cisco', '3750', 'London'] ['sw2', 'Cisco', '3850', 'Liverpool'] ['sw3', 'Cisco', '3650', 'Liverpool'] ['sw4', 'Cisco', '3650', 'London']

First list contains column names and remaining list contains the corresponding values.

Note that csv.reader returns an iterator:

In [1]: import csv In [2]: with open('sw_data.csv') as f: . : reader = csv.reader(f) . : print(reader) . : _csv.reader object at 0x10385b050> 

If necessary it could be converted into a list in the following way:

In [3]: with open('sw_data.csv') as f: . : reader = csv.reader(f) . : print(list(reader)) . : [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London'], ['sw2', 'Cisco', '3850', 'Liverpool'], ['sw3', 'Cisco', '3650', 'Liverpool'], ['sw4', 'Cisco', '3650', 'London']] 

Most often column headers are more convenient to get by a separate object. This can be done in this way (csv_read_headers.py file):

import csv with open('sw_data.csv') as f: reader = csv.reader(f) headers = next(reader) print('Headers: ', headers) for row in reader: print(row) 

Sometimes it is more convenient to get dictionaries in which keys are column names and values are column values.

For this purpose, module has DictReader (csv_read_dict.py file):

import csv with open('sw_data.csv') as f: reader = csv.DictReader(f) for row in reader: print(row) print(row['hostname'], row['model']) 
$ python csv_read_dict.py sw1 3750 sw2 3850 sw3 3650 sw4 3650

Prior to Python 3.8 OrderedDict type was returned, not dict.

Writing#

Similarly, a csv module can be used to write data to file in CSV format (csv_write.py file):

import csv data = [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London, Best str'], ['sw2', 'Cisco', '3850', 'Liverpool, Better str'], ['sw3', 'Cisco', '3650', 'Liverpool, Better str'], ['sw4', 'Cisco', '3650', 'London, Best str']] with open('sw_data_new.csv', 'w') as f: writer = csv.writer(f) for row in data: writer.writerow(row) with open('sw_data_new.csv') as f: print(f.read()) 

In example above, strings from list are written to the file and then the content of file is displayed on standard output stream.

The output will be as follows:

$ python csv_write.py hostname,vendor,model,location sw1,Cisco,3750,"London, Best str" sw2,Cisco,3850,"Liverpool, Better str" sw3,Cisco,3650,"Liverpool, Better str" sw4,Cisco,3650,"London, Best str"

Note the interesting thing: strings in the last column are quoted and other values are not.

This is because all strings in the last column have a comma. And quotes indicate what is an entire string. When a comma is inside quotation marks the csv module does not perceive it as a separator.

Sometimes it’s better to have all strings quoted. Of course, in this case, example is simple enough but when there are more values in the strings, the quotes indicate where value begins and ends.

Csv module allows you to control this. For all strings to be written in a CSV file with quotes you should change script this way (csv_write_quoting.py file):

import csv data = [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London, Best str'], ['sw2', 'Cisco', '3850', 'Liverpool, Better str'], ['sw3', 'Cisco', '3650', 'Liverpool, Better str'], ['sw4', 'Cisco', '3650', 'London, Best str']] with open('sw_data_new.csv', 'w') as f: writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) for row in data: writer.writerow(row) with open('sw_data_new.csv') as f: print(f.read()) 
$ python csv_write_quoting.py "hostname","vendor","model","location" "sw1","Cisco","3750","London, Best str" "sw2","Cisco","3850","Liverpool, Better str" "sw3","Cisco","3650","Liverpool, Better str" "sw4","Cisco","3650","London, Best str"

Now all values are quoted. And because model number is given as a string in original list, it is quoted here as well.

Besides writerow method, writerows method is supported. It accepts any iterable object.

So, previous example can be written this way (csv_writerows.py file):

import csv data = [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London, Best str'], ['sw2', 'Cisco', '3850', 'Liverpool, Better str'], ['sw3', 'Cisco', '3650', 'Liverpool, Better str'], ['sw4', 'Cisco', '3650', 'London, Best str']] with open('sw_data_new.csv', 'w') as f: writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) writer.writerows(data) with open('sw_data_new.csv') as f: print(f.read()) 

DictWriter#

With DictWriter you can write dictionaries in CSV format.

In general, DictWriter works as writer but since dictionaries are not ordered it is necessary to specify the order of columns in file. The fieldnames option is used for this purpose (csv_write_dict.py file):

import csv data = [ 'hostname': 'sw1', 'location': 'London', 'model': '3750', 'vendor': 'Cisco' >,  'hostname': 'sw2', 'location': 'Liverpool', 'model': '3850', 'vendor': 'Cisco' >,  'hostname': 'sw3', 'location': 'Liverpool', 'model': '3650', 'vendor': 'Cisco' >,  'hostname': 'sw4', 'location': 'London', 'model': '3650', 'vendor': 'Cisco' >] with open('csv_write_dictwriter.csv', 'w') as f: writer = csv.DictWriter( f, fieldnames=list(data[0].keys()), quoting=csv.QUOTE_NONNUMERIC) writer.writeheader() for d in data: writer.writerow(d) 

Delimiter#

Sometimes other values are used as a separator. In this case, it should be possible to tell module which separator to use.

For example, if the file uses separator ; (sw_data2.csv file):

hostname;vendor;model;location sw1;Cisco;3750;London sw2;Cisco;3850;Liverpool sw3;Cisco;3650;Liverpool sw4;Cisco;3650;London 

Simply specify which separator is used in reader (csv_read_delimiter.py file):

import csv with open('sw_data2.csv') as f: reader = csv.reader(f, delimiter=';') for row in reader: print(row) 

Источник

Как читать и писать CSV-файлы в Python

Esther Vaati

Esther Vaati Last updated Dec 5, 2017

Формат CSV является наиболее часто используемым форматом импорта и экспорта для баз данных и электронных таблиц. В этом руководстве будет подробно рассказано о CSV, а также о модулях и классах, доступных для чтения и записи данных в файлы CSV. Также будет рассмотрен рабочий пример, показывающий, как читать и записывать данные в файл CSV на Python.

Что такое файл CSV?

Файл CSV (значения, разделенные запятыми) позволяет сохранять данные в табличной структуре с расширением .csv. CSV-файлы широко используются в приложениях электронной коммерции, поскольку их очень легко обрабатывать. Некоторые из областей, где они были использованы, включают в себя:

  • импорт и экспорт данных клиентов
  • импорт и экспорт продукции
  • экспорт заказов
  • экспорт аналитических отчетов по электронной коммерции

Модули для чтения и записи

Модуль CSV имеет несколько функций и классов, доступных для чтения и записи CSV, и они включают в себя:

  • функция csv.reader
  • функция csv.writer
  • класс csv.Dictwriter
  • класс csv.DictReader

csv.reader

Модуль csv.reader принимает следующие параметры:

  • csvfile : обычно это объект, который поддерживает протокол итератора и обычно возвращает строку каждый раз, когда вызывается его метод __next__() .
  • dialect=’excel’: необязательный параметр, используемый для определения набора параметров, специфичных для определенного диалекта CSV.
  • fmtparams : необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.

Вот пример того, как использовать модуль csv.reader.

with open('example.csv', newline='') as File: 

модуль csv.writer

Этот модуль похож на модуль csv.reader и используется для записи данных в CSV. Требуется три параметра:

  • csvfile : это может быть любой объект с методом write() .
  • dialect = ‘excel’ : необязательный параметр, используемый для определения набора параметров, специфичных для конкретного CSV.
  • fmtparam : необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.

Классы DictReader и DictWriter

DictReader и DictWriter — это классы, доступные в Python для чтения и записи в CSV. Хотя они и похожи на функции чтения и записи, эти классы используют объекты словаря для чтения и записи в CSV-файлы.

DictReader

Он создает объект, который отображает прочитанную информацию в словарь, ключи которого задаются параметром fieldnames . Этот параметр является необязательным, но если он не указан в файле, данные первой строки становятся ключами словаря.

with open('name.csv') as csvfile: 
reader = csv.DictReader(csvfile) 
print(row['first_name'], row['last_name']) 

DictWriter

Этот класс аналогичен классу DictWriter и выполняет противоположную функцию: запись данных в файл CSV. Класс определяется как csv.DictWriter(csvfile, fieldnames,restval=», extrasaction=’raise’,dialect=’excel’, *args, **kwds)

Параметр fieldnames определяет последовательность ключей, которые определяют порядок, в котором значения в словаре записываются в файл CSV. В отличие от DictReader, этот ключ не является обязательным и должен быть определен во избежание ошибок при записи в CSV.

Диалекты и форматирование

Диалект — это вспомогательный класс, используемый для определения параметров для конкретного экземпляра reader или writer . Диалекты и параметры форматирования должны быть объявлены при выполнении функции чтения или записи.

Есть несколько атрибутов, которые поддерживаются диалектом:

  • delimiter: строка, используемая для разделения полей. По умолчанию это ‘,’ .
  • double quote: Управляет тем, как должны появляться в кавычках случаи, когда кавычки появляются внутри поля. Может быть True или False.
  • escapechar: строка, используемая автором для экранирования разделителя, если в кавычках задано значение QUOTE_NONE .
  • lineterminator: строка, используемая для завершения строк, созданных writer . По умолчанию используется значение ‘\r\n’ .
  • quotechar: строка, используемая для цитирования полей, содержащих специальные символы. По умолчанию это ‘»‘ .
  • skipinitialspace: Если установлено значение True , любые пробелы, следующие сразу за разделителем, игнорируются.
  • strict: если установлено значение True , возникает Error при неправильном вводе CSV.
  • quoting: определяет, когда следует создавать кавычки при чтении или записи в CSV.

Чтение файла CSV

Давайте посмотрим, как читать CSV-файл, используя вспомогательные модули, которые мы обсуждали выше.

Создайте свой CSV-файл и сохраните его как example.csv. Убедитесь, что он имеет расширение .csv и заполните некоторые данные. Здесь у нас есть CSV-файл, который содержит имена учеников и их оценки.

Creating a spreadsheet to generate a CSV

Ниже приведен код для чтения данных в нашем CSV с использованием функции csv.reader и класса csv.DictReader .

Чтение CSV-файла с помощью csv.reader

Источник

Читайте также:  Java threads 3rd edition
Оцените статью