Python Pandas解析读写 CSV 文件


Posted in Python onApril 11, 2022

什么是 CSV 文件

CSV 文件(逗号分隔值文件)是一种纯文本文件,它使用特定的结构来排列表格数据。因为它是一个纯文本文件,所以只能包含实际的文本数据,换句话说就是可打印的 ASCII 或 Unicode 字符。

通常,CSV 文件的结构由其名称给出,使用逗号分隔每个特定数据值。

column 1 name,column 2 name, column 3 name
first row data 1,first row data 2,first row data 3
second row data 1,second row data 2,second row data 3
...

每条数据是如何用逗号分隔的。第一行为数据列的名称,有的时候也可以为空第一行就是实际的数据。之后的每一行都是实际数据,仅受文件大小限制。

CSV 文件从何而来?

CSV 文件通常由处理大量数据的程序创建。从电子表格和数据库中导出数据以及在其他程序中导入。例如可以将数据挖掘程序的结果导出为 CSV 文件,然后将其导入电子表格以分析数据、生成图表以进行演示或准备发布报告。

CSV 文件非常容易以编程方式处理。任何支持文本文件输入和字符串操作的语言(如 Python)都可以直接处理 CSV 文件。

CSV 库解析 CSV 文件

csv 库提供读取和写入 CSV 文件的功能。专为使用 Excel 生成的 CSV 文件开箱即用而设计,适应各种 CSV 格式。该 csv 库包含对象和其他代码,用于从 CSV 文件读取、写入和处理数据。

Python Pandas解析读写 CSV 文件

读取 CSV 文件

CSV 文件使用 Python 的内置open()函数作为文本文件打开,该函数返回一个文件对象。然后使用 reader 对象完成从 CSV 文件中的读取。

employee_birthday.txt

name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March

直接读取的方法。

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'Column 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.')

字典方式读取的方法。

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 month
    John Smith works in the Accounting department, and was born in November.
    Erica Meyers works in the IT department, and was born in March.
Processed 3 lines.

CSV reader 参数

reader 对象可以通过指定附加参数来处理不同样式的 CSV 文件。

delimiter 指定用于分隔每个字段的字符,默认值为逗号 (‘,’)。

quotechar 指定用于包围包含分隔符的字段的字符,默认值为双引号 ( ’ " ')。

escapechar 指定用于转义分隔符的字符以防不使用引号,默认是没有转义字符。

employee_addresses.txt

name,address,date joined
john smith,1132 Anywhere Lane Hoboken NJ, 07030,Jan 4
erica meyers,1234 Smith Lane Hoboken NJ, 07030,March 2

此 CSV 文件包含三个字段:name、address 和 date joined,由逗号分隔。问题是 address 字段的数据还包含一个逗号来表示邮政编码。

思考一下这个应该怎么处理?

CSV 文件的写入

CSV 文件的写入可以使用 .write_row() 方法进行操作。

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

quotechar 用来包围含特殊字符的字段,排除歧义使用。

quoting的几种控制引号行为情况:

csv.QUOTE_NONNUMERIC) # 非数字加引号

csv.QUOTE_ALL # 所有字段加引号

csv.QUOTE_MINIMAL # 特殊字段加引号

csv.QUOTE_NONE # 都不加引号

字典方式写入。

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'})

employee_file2.csv

emp_name,dept,birth_month
John Smith,Accounting,November
Erica Meyers,IT,March

使用 pandas 库解析 CSV 文件

pandas 是一个开源 Python 库,提供高性能的数据分析工具和易于使用的数据结构,可以共享数据、代码、分析结果、可视化和叙述性文本。

Python Pandas解析读写 CSV 文件

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可以快速的读取。

import pandas
df = pandas.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

使用pandas读取数据时可以格式化日期格式。

import pandas
df = pandas.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

pandas 写入 CSV 文件

读取到 pandas 的内容可以直接写入到新的 csv 文件。

import pandas
df = pandas.read_csv('hrdata.csv', 
            index_col='Employee', 
            parse_dates=['Hired'],
            header=0, 
            names=['Employee', 'Hired', 'Salary', 'Sick Days'])
df.to_csv('hrdata_modified.csv')

print(df)
Employee,Hired,Salary,Sick Days
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
Python 相关文章推荐
在python的WEB框架Flask中使用多个配置文件的解决方法
Apr 18 Python
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
基于django传递数据到后端的例子
Aug 16 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
利用Python实时获取steam特惠游戏数据
Jun 25 Python
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
You might like
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
基于jQuery架构javascript基础体系
2011/01/01 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
JS script脚本中async和defer区别详解
2020/06/24 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Python面向对象进阶学习
2019/05/21 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
团支部建设方案
2014/05/02 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
运动会宣传稿50字
2015/07/23 职场文书
三好学生竞选稿
2015/11/21 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang