详解Python读取和写入操作CSV文件的方法
作者:Mr数据杨 发布时间:2021-03-01 23:13:43
最流行的数据交换格式之一是 CSV 格式。是需要通过键盘和控制台以外的方式将信息输入和输出的程序,通过文本文件交换信息是在程序之间共享信息的常用方法。
这里带和我一起回顾学习如何使用 Python 从文本文件中读取、处理和解析 CSV。
什么是 CSV 文件?
CSV 文件(逗号分隔值文件)是一种纯文本文件,它使用特定的结构来排列表格数据。因为它是一个纯文本文件,所以它只能包含实际的文本数据,换句话说就是可打印的ASCII或Unicode字符。
CSV 文件的结构由其名称给出。通常 CSV 文件使用逗号分隔每个特定数据值。
column 1 name,column 2 name, column 3 name
1st row data 1,1st row data 2,1st row data 3
2nd row data 1,2nd row data 2,2nd row data 3
注意每条数据是如何用逗号分隔的。通常第一行标识每条数据换句话说,就是数据列的名称。之后的每一行都是实际数据,并且受文件大小限制。
通常分隔符(,)逗号不是唯一使用的。其他流行的分隔符包括制表符 ( \t)、冒号 ( : ) 和分号 ( ; ) 字符。
正确解析 CSV 文件需要知道正在使用哪个分隔符。
CSV 文件从何而来?
CSV 文件通常由处理大量数据的程序创建。它们是从电子表格和数据库中导出数据以及在其他程序中导入或使用数据的便捷方式。例如可以将数据挖掘程序的结果导出为 CSV 文件,然后将其导入电子表格以分析数据、生成图表以进行演示或准备发布报告。
CSV 文件非常容易以 Python编程方式处理,可以直接处理 CSV 文件。
内置 CSV 库解析 CSV 文件
csv库专为使用 Excel 生成的 CSV 文件开箱即用而设计,并且适应各种 CSV 格式。
读取 CSV 文件csv
CSV 文件使用 Python 的内置 open() 函数作为文本文件打开,该函数返回一个文件对象,然后将其传递给 reader 执行读取工作。
# employee_birthday.txt
name,department,birthday
John,IT,November
Tom,IT,March
读取操作代码,返回的每一行reader都是一个元素列表,String其中包含通过删除分隔符找到的数据。返回的第一行包含以特殊方式处理的列名。
import csv
with open('employee_birthday.txt') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
line_count = 0
for row in csv_reader:
if line_count == 0:
print(f'names are {", ".join(row)}')
line_count += 1
else:
print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
line_count += 1
print(f'Processed {line_count} lines.')
names are name, department, birthday
John works in the IT department, and was born in November.
Tom works in the IT department, and was born in March.
Processed 3 lines.
将 CSV 文件读入字典csv
除了处理单个String元素的列表,还可以将 CSV 数据直接读入字典。
import csv
with open('employee_birthday.txt', mode='r') as csv_file:
csv_reader = csv.DictReader(csv_file)
line_count = 0
for row in csv_reader:
if line_count == 0:
print(f'Column names are {", ".join(row)}')
line_count += 1
print(f'\t{row["name"]} works in the {row["department"]} department, and was born in {row["birthday month"]}.')
line_count += 1
print(f'Processed {line_count} lines.')
Column names are name, department, birthday
John works in the IT department, and was born in November.
Tom works in the IT department, and was born in March.
Processed 3 lines.
可选的 Python CSV reader参数
delimiter 指定用于分隔每个字段的字符。默认值为逗号 ( ’ , ')。
quotechar 指定用于包围包含分隔符的字段的字符。默认值为双引号 ( ’ " ')。
escapechar 指定用于转义分隔符的字符,以防不使用引号。默认是没有转义字符。
name,address,date joined
john,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4
erica,1234 Smith Lane Hoboken NJ, 07030,March 2
此 CSV 文件包含三个字段:name、address和date joined,它们由逗号分隔。问题是该 address 字段的数据还包含一个逗号来表示邮政编码。
有三种方法可以处理这个。
使用不同的分隔符,使用delimiter可选参数来指定新的分隔符。
将数据括在引号,选择的分隔符的特殊性质在带引号的字符串中会被忽略。quotechar 可以使用可选参数指定用于引用的字符。
转义数据中的分隔符,转义字符的工作方式与它们在格式字符串中的作用一样,使对被转义字符(在本例中为分隔符)的解释无效。如果使用转义字符,则必须使用 escapechar 可选参数指定。
使用 csv 写入文件
可以使用 writer 对象和 .write_row() 方法写入 CSV 文件。
import csv
with open('employee_file.csv', mode='w') as employee_file:
employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
employee_writer.writerow(['John Smith', 'Accounting', 'November'])
employee_writer.writerow(['Erica Meyers', 'IT', 'March'])
csv.QUOTE_MINIMAL means only when required, for example, when a field contains either the quotechar or the delimiter
csv.QUOTE_ALL means that quotes are always placed around fields.
csv.QUOTE_NONNUMERIC means that quotes are always placed around
fields which do not parse as integers or floating point numbers.
csv.QUOTE_NONE means that quotes are never placed around fields.
csv.QUOTE_MINIMAL: writer对象只引用那些包含特殊字符。
csv.QUOTE_ALL: writer对象引用所有字段,如字段分隔符,quotechar或任何字符 lineterminator。
csv.QUOTE_NONNUMERIC: writer对象引用所有非数字字段,指示读者将所有非引用字段转换为float类型。
csv.QUOTE_NONE: writer对象不引用字段,如未设置escapechar错误抛出;指示reader不对引号字符执行特殊处理。
John Smith,Accounting,November
Erica Meyers,IT,March
从字典中写入 CSV 文件csv
编写字典时需要 DictReader 参数。
import csv
with open('employee_file2.csv', mode='w') as csv_file:
fieldnames = ['emp_name', 'dept', 'birth_month']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'emp_name': 'John Smith', 'dept': 'Accounting', 'birth_month': 'November'})
writer.writerow({'emp_name': 'Erica Meyers', 'dept': 'IT', 'birth_month': 'March'})
使用 pandas 库解析 CSV 文件
可以先安装 pandas 库。
pip install pandas
pandas 读取 CSV 文件
# hrdata.csv
Name,Hire Date,Salary,Sick Days remaining
Graham Chapman,03/15/14,50000.00,10
John Cleese,06/01/15,65000.00,8
Eric Idle,05/12/14,45000.00,10
Terry Jones,11/01/13,70000.00,3
Terry Gilliam,08/12/14,48000.00,7
Michael Palin,05/23/13,66000.00,8
使用 pandas 读取 csv 文件。
import pandas as pd
df = pd.read_csv('hrdata.csv')
print(df)
Name Hire Date Salary Sick Days remaining
0 Graham Chapman 03/15/14 50000.0 10
1 John Cleese 06/01/15 65000.0 8
2 Eric Idle 05/12/14 45000.0 10
3 Terry Jones 11/01/13 70000.0 3
4 Terry Gilliam 08/12/14 48000.0 7
5 Michael Palin 05/23/13 66000.0 8
增加索引列读取 csv 文件,这样索引序号就没有了。
import pandas as pd
df = pd.read_csv('hrdata.csv', index_col='Name')
print(df)
Hire Date Salary Sick Days remaining
Name
Graham Chapman 03/15/14 50000.0 10
John Cleese 06/01/15 65000.0 8
Eric Idle 05/12/14 45000.0 10
Terry Jones 11/01/13 70000.0 3
Terry Gilliam 08/12/14 48000.0 7
Michael Palin 05/23/13 66000.0 8
修复Hire Date字段的数据类型为日期数据。
import pandas as pd
df = pd.read_csv('hrdata.csv', index_col='Name', parse_dates=['Hire Date'])
print(df)
Hire Date Salary Sick Days remaining
Name
Graham Chapman 2014-03-15 50000.0 10
John Cleese 2015-06-01 65000.0 8
Eric Idle 2014-05-12 45000.0 10
Terry Jones 2013-11-01 70000.0 3
Terry Gilliam 2014-08-12 48000.0 7
Michael Palin 2013-05-23 66000.0 8
也可以统一进行处理。
import pandas as pd
df = pd.read_csv('hrdata.csv',
index_col='Employee',
parse_dates=['Hired'],
header=0,
names=['Employee', 'Hired','Salary', 'Sick Days'])
print(df)
Hired Salary Sick Days
Employee
Graham Chapman 2014-03-15 50000.0 10
John Cleese 2015-06-01 65000.0 8
Eric Idle 2014-05-12 45000.0 10
Terry Jones 2013-11-01 70000.0 3
Terry Gilliam 2014-08-12 48000.0 7
Michael Palin 2013-05-23 66000.0 8
pandas 写入 CSV 文件
写入操作和读取操作一样简单。
import pandas as pd
df = pd.read_csv('hrdata.csv',
index_col='Employee',
parse_dates=['Hired'],
header=0,
names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')
来源:https://blog.csdn.net/qq_20288327/article/details/123688215
猜你喜欢
- 今天学习了数组,可以说是PHP的数据应用中较重要的一种方式。PHP的数组函数众多,下面是我学习的小结,借此记之,便于以后鉴之…… 一、数组定
- 批量处理文件时,常需要先遍历某个路径提取特定条件的文件名。这篇写一个暴力遍历但很简洁的方法,真的非常简洁但是非常暴力。例子目标是:获得存放遥
- 看了大神统计voc数据集标签框后,针对自己标注数据集,灵活应用 ,感谢!看代码吧~import reimport osimport xml.
- 下载了一个小型的记帐软件,发现这个软件数据库用的是access,很想看看它的数据库结构怎样,结果人家加密了。access的解密小case了,
- 每个 ndarray 都有一个关联的数据类型 (dtype) 对象。这个数据类型对象(dtype)告诉我们数组的布局。这意味着它为我们提供了
- 周末在家,儿子闹着要玩游戏,让玩吧,不利于健康,不让玩吧,扛不住他折腾,于是想,不如一起搞个小游戏玩玩!之前给他编过猜数字 和 掷骰子 游戏
- 很多jsp程序员都遇到过这样的情况,jsp页面传递参数到servlet,只要参数有中文就是乱码,且大多数是??????乱码,尝试了网上比较普
- 通配符的分类:%百分号通配符: 表示任何字符出现任意次数 (可以是0次)._下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符
- 相机固定不动,通过标定版改动不同方位的位姿进行抓拍import cv2camera=cv2.VideoCapture(1)i = 0whil
- 本文实例讲述了django框架实现模板中获取request 的各种信息。分享给大家供大家参考,具体如下:在做网页程序时,request,re
- 在 asp 应用中,经常用到 Session 对象来保存用户临时私有数据,而 asp 的 Session 对象是依赖于浏览器的 Cookie
- 前言编程是一件很快乐的事,实现一个目的,我们可以有很多方法路径,在这篇文章我们介绍一些JavaScript的奇技淫巧,仅供大家参考,各路大神
- 这几天看了篇叫"Penetration: from application down to OS (Oracle)"的文
- 用于模式匹配的String方法:String支持4种使用正则表达式的方法:seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的
- 为了使一个MySQL系统安全,强烈要求你考虑下列建议……当你连接一个MySQL服务器时,你通常应
- 北京时间2月15日据国外媒体报道,美国知名sns网站Facebook全球活跃用户量已突破1.75亿大关。数据显示,全球20%的网民都使用Fa
- 折腾好半天的数据库连接,由于之前未安装 pip ,而且自己用的python 版本为3.6. 只能用 pymysql 来连接数据库,下边 简单
- 我就废话不多说了,直接上代码吧!#Copyright (c)2017, 东北大学软件学院学生# All rightsreserved#文件名
- 首先需求一共有五次猜测机会,在五次机会中才对就赢了,结束游戏,五次都猜错就输了,也结束游戏。首先先画个草图,这是我画的草图再根据草图编写一个
- 1. 栗子为了加深大家的印象,首先我们来看个例子:图示如下:2. 矩形计算面积我们知道,在数学中,积分运算表示上述曲线和x轴围成的封闭区域的