Read csv delimiter python

Работа с файлами в формате CSV#

CSV (comma-separated value) — это формат представления табличных данных (например, это могут быть данные из таблицы или данные из БД).

В этом формате каждая строка файла — это строка таблицы. Несмотря на название формата, разделителем может быть не только запятая.

И хотя у форматов с другим разделителем может быть и собственное название, например, TSV (tab separated values), тем не менее, под форматом CSV понимают, как правило, любые разделители.

Пример файла в формате CSV (sw_data.csv):

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

В стандартной библиотеке Python есть модуль csv, который позволяет работать с файлами в CSV формате.

Чтение#

Пример чтения файла в формате CSV (файл csv_read.py):

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']

В первом списке находятся названия столбцов, а в остальных соответствующие значения.

Обратите внимание, что сам csv.reader возвращает итератор:

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

При необходимости его можно превратить в список таким образом:

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']] 

Чаще всего заголовки столбцов удобней получить отдельным объектом. Это можно сделать таким образом (файл csv_read_headers.py):

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) 

Иногда в результате обработки гораздо удобней получить словари, в которых ключи — это названия столбцов, а значения — значения столбцов.

Для этого в модуле есть DictReader (файл csv_read_dict.py):

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

До Python 3.8 возвращался отдельный тип упорядоченные словари (OrderedDict).

Запись#

Аналогичным образом с помощью модуля csv можно и записать файл в формате CSV (файл csv_write.py):

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()) 

В примере выше строки из списка сначала записываются в файл, а затем содержимое файла выводится на стандартный поток вывода.

$ 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"

Обратите внимание на интересную особенность: строки в последнем столбце взяты в кавычки, а остальные значения — нет.

Так получилось из-за того, что во всех строках последнего столбца есть запятая. И кавычки указывают на то, что именно является целой строкой. Когда запятая находится в кавычках, модуль csv не воспринимает её как разделитель.

Иногда лучше, чтобы все строки были в кавычках. Конечно, в данном случае достаточно простой пример, но когда в строках больше значений, то кавычки позволяют указать, где начинается и заканчивается значение.

Модуль csv позволяет управлять этим. Для того, чтобы все строки записывались в CSV-файл с кавычками, надо изменить скрипт таким образом (файл csv_write_quoting.py):

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"

Теперь все значения с кавычками. И поскольку номер модели задан как строка в изначальном списке, тут он тоже в кавычках.

Кроме метода writerow, поддерживается метод writerows. Ему можно передать любой итерируемый объект.

Например, предыдущий пример можно записать таким образом (файл csv_writerows.py):

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#

С помощью DictWriter можно записать словари в формат CSV.

В целом DictWriter работает так же, как writer, но так как словари не упорядочены, надо указывать явно в каком порядке будут идти столбцы в файле. Для этого используется параметр fieldnames (файл csv_write_dict.py):

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) 

Указание разделителя#

Иногда в качестве разделителя используются другие значения. В таком случае должна быть возможность подсказать модулю, какой именно разделитель использовать.

Например, если в файле используется разделитель ; (файл sw_data2.csv):

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

Достаточно просто указать, какой разделитель используется в reader (файл csv_read_delimiter.py):

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

Источник

How To Read A CSV File In Python

Kelly Moreira %

I first began to work with CSV files when taking the backend portion of my software engineering bootcamp curriculum. It wasn’t until I began to dive more into the data science portion of my continued learning that I began to use them on a regular basis.

CSV stands for comma-separated values, and files containing the .csv extension contain a collection of comma-separated values used to store data.

In this tutorial we will be using the public Beach Water Quality data set stored in the bwq.csv file. You can obtain the file by downloading it from Kaggle, however, you should be able to read any csv file following the instructions below.

Read A CSV File Using Python

There are two common ways to read a .csv file when using Python. The first by using the csv library, and the second by using the pandas library.

1. Using the CSV Library

 import csv with open("./bwq.csv", 'r') as file: csvreader = csv.reader(file) for row in csvreader: print(row)

Here we are importing the csv library in order to use the .reader() method it contains to help us read the csv file.

The with keyword allows us to both open and close the file without having to explicitly close it.

The open() method takes two arguments of type string . First the file name, and second a mode argument. We are using r for read, however this can be omitted as r is assumed by default.

We then iterate over all the rows.

You should expect an output in the terminal to look something like this:

2. Using the Pandas Library

 import pandas as pd data = pd.read_csv("bwq.csv") data

Here we’re importing Pandas, a Python library used to conduct data manipulation and analysis. It contains the .read_csv() method we need in order to read our csv file.

You should expect the output to look something like this:

Possible Delimiters Issues

The majority of csv files are separated by commas, however, there are some that are separated by other characters, like colons for example, which can output strange results in Python.

Solution For Delimiters Using the CSV Library

To change the delimiter using the csv library, simply pass in the delimiter= ‘:’ argument in the reader() method like so:

 import csv with open("./fileWithColonDelimeter.csv", 'r') as file: csvreader = csv.reader(file, delimiter=':') for row in csvreader: print(row)

For other edge cases in reading csv files using the csv library, check out this page in the Python docs.

Solution For Delimiters Using the Pandas Library

To change the delimiter using the pandas library, simply pass in the argument delimiter= ‘:’ in the read_csv() method like so:

 import pandas as pd data = pd.read_csv("fileWithColonDelimeter.csv", delimiter= ':') data

For other edge cases in reading csv files using the Pandas library check out this page the Pandas docs.

Up Next

Better Dependency Management in Python is a great introduction to using Earthly with Python and if you want to bring your CI to the next level, check out Earthly’s open source build tool.

Earthly makes CI/CD super simple
Fast, repeatable CI/CD with an instantly familiar syntax – like Dockerfile and Makefile had a baby.

Источник

Читайте также:  Include path on page in php
Оцените статью