- Работа с файлами в формате CSV#
- Чтение#
- Запись#
- DictWriter#
- Указание разделителя#
- CSV — Python Read & Write
- How to read csv files in python
- Read csv file line by line
- How to read csv file with header in Python
- How to write to CSV file in Python
- How to Read CSV with Headers Using Pandas?
- Importing Pandas:
- Using read_csv() to read CSV files with headers
- Summary
Работа с файлами в формате 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)
CSV — Python Read & Write
This tutorial covers How to Read and Write CSV files in python with example tutorials..
- Read csv files without headers using csv module reader function, and read headers with the DictReader class in python
How to read csv files in python
python has CSV library, that you need to read and write modules emp.csv file contains comma-separated values as given
Read csv file line by line
First, Import csv module into the code using the import statement
Next, Open the file using open with the name of the file.
If file not found, It throws FileNotFoundError: [Errno 2] No such file or directory: . and stacktrace is
file = open('emp1.csv') FileNotFoundError: [Errno 2] No such file or directory: 'emp.csv'
next, Create a reader using csv reader function, and pass the file variable to it.
use for in loop to read the line by line, and print the line. Each line is a row in a csv file with many columns.
Here is a complete example
You can access individual values using line[0] for first value, second value using line[1]
How to read csv file with header in Python
Sometimes, CSV file contains headers id,name,salary,dept as given below First line contains the header columns.
DictReader class used instead reader function. It pro
- Create a DictReader class
- Iterate each row using for in loop
- print using row[columnname] to get the value
import csv with open(“emp.csv”) as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row[‘id’]+» — “+row[’name’])
How to write to CSV file in Python
- Create a Writer using DictWriter with file and headernames
- Write header using writeheader(), creates first line of header column names
- Add data using writeRow function with an object of key and values.
Here is a python write CSV file example
) writer.writerow() writer.writerow()
emp1.csv file created with below rows
How to Read CSV with Headers Using Pandas?
While Python is all game for analyzing data, it is not inherently blessed with the sources of data sets that ought to be analysed. All these data sets are to be sourced from elsewhere & are to be fed into Python for the magic to happen. We shall explore one such technique for importing data into Python using one of its in-built features. The file of interest in this article shall also be a bit specific – a CSV file with headers!
We shall demonstrate the sequence of operations using the following dataset in which each entry in a row is separated from each other by a ‘tab’. Let’s get started!
Importing Pandas:
One shall get things started by importing the Pandas library into the active Python window using the below code.
Hit enter once done & wait for a few moments while the software loads the ‘Pandas’ library in the backend. This can very well be spotted by the arrowheads preceding every line of code. These arrows shall not appear in the new line before the ‘Pandas’ are fully loaded.
Only upon successful loading of the Pandas, these arrowheads shall appear as shown in the below image.
Using read_csv() to read CSV files with headers
CSV stands for comma-separated values. Which values, you ask – those that are within the text file!
What it implies is that the values within the text file are separated by a comma to isolate one entry from the other. Though it states only ‘comma’ as a separator, CSV is broadly used to denote the text files within which the separation is carried out by tabs or spaces or even colons, to name a few.
df = pd.read_csv(“filename.txt”,sep=”x”, header=y, names=[‘name1’, ‘name2’…])
- df – dataframe
- filename.txt – name of the text file that is to be imported.
- x – type of separator used in the .csv file.
- “\t” – tab
- “,” – comma
- “ “ – space & so on
- None – if the entries in the first row are not headers
- 0 – if the entries in the first row are headers
Now we shall apply this syntax for importing the data from the text file shown earlier in this article.
The “filename.txt” is replaced by “Sales Data.txt”, “x” is replaced by “\t” & y is replaced by 0 (zero) since the data contain a header row. After these replacements, the resulting code shall be as follows,
df = pd.read_csv("Sales Data.txt", sep="\t", header=0)
Hit ENTER & one shall know that there aren’t any errors if the arrowheads appear after a few moments of utter silence.
The arrowheads tell that the data has been successfully imported into Python but would it give us any sort of satisfaction, had we not sneaked a peek into it?
The print() command available in Python serves the purpose. The data frame to which the data was loaded onto using the read_csv() command can now be viewed using,
Hit ENTER after typing the above & the imported data shall appear as shown below.
It is also to be noted that even if the header=0 is skipped in the code, the read_csv() is set to choose 0 as the header (i.e) the first row as a header by default so that the data is imported considering the same.
Summary
Now that we have reached the end of this article, hope it has elaborated on how to read CSV files with Headers using Pandas in Python. Here’s another article which details the usage of fillna() method in Pandas. There are numerous other enjoyable & equally informative articles in AskPython that might be of great help for those who are looking to level up in Python.