Python 操作 CSV
使用过 CSV 文件都知道:如果我们的电脑中装了 WPS 或 Microsoft Office 的话,.csv 文件默认是被 Excel 打开的,那么什么是 CSV 文件?CSV 文件与 Excel 文件有什么区别?如何通过 Python 来操作 CSV 文件呢?带着这些问题我们接着往下看。
1 简介
1.1 CSV
CSV 全称 Comma-Separated Values,中文叫逗号分隔值或字符分隔值,它以纯文本形式存储表格数据(数字和文本),其本质就是一个字符序列,可以由任意数目的记录组成,记录之间以某种换行符分隔,每条记录由字段组成,通常所有记录具有完全相同的字段序列,字段间常用逗号或制表符进行分隔。CSV 文件格式简单、通用,在现实中有着广泛的应用,其中使用最多的是在程序之间转移表格数据。
1.2 CSV 与 Excel
因为 CSV 文件与 Excel 文件默认都是用 Excel 工具打开,那他们有什么区别呢?我们通过下表简单了解一下。
| CSV | Excel |
|---|---|
文件后缀为 .csv | 文件后缀为 .xls或 .xlsx |
| 纯文本文件 | 二进制文件 |
| 存储数据不包含格式、公式等 | 不仅可以存储数据,还可以对数据进行操作 |
| 可以通过 Excel 工具打开,也可以通过文本编辑器打开 | 只能通过 Excel 工具打开 |
| 只能编写一次列标题 | 每一行中的每一列都有一个开始标记和结束标记 |
| 导入数据时消耗内存较少 | 导入数据时消耗内存较多 |
2 基本使用
Python 通过 csv 模块来实现 CSV 格式文件中数据的读写,该模块提供了兼容 Excel 方式输出、读取数据文件的功能,这样我们无需知道 Excel 所采用 CSV 格式的细节,同样的它还可以定义其他应用程序可用的或特定需求的 CSV 格式。
csv 模块中使用 reader 类和 writer 类读写序列化的数据,使用 DictReader 类和 DictWriter 类以字典的形式读写数据,下面来详细看一下相应功能。首先来看一下 csv 模块常量信息,如下所示:
| 属性 | 说明 |
|---|---|
| QUOTE_ALL | 指示 writer 对象给所有字段加上引号 |
| QUOTE_MINIMAL | 指示 writer 对象仅为包含特殊字符(如:定界符、引号字符、行结束符等)的字段加上引号 |
| QUOTE_NONNUMERIC | 指示 writer 对象为所有非数字字段加上引号 |
| QUOTE_NONE | 指示 writer 对象不使用引号引出字段 |
writer(csvfile, dialect='excel', **fmtparams)
返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。csvfile 可以是具有 write() 方法的任何对象,如果 csvfile 是文件对象,则使用 newline='' 打开;可选参数 dialect 是用于不同的 CSV 变种的特定参数组;可选关键字参数 fmtparams 可以覆写当前变种格式中的单个格式设置。看下示例:
import csvwith open('test.csv', 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerow(['id', 'name', 'age'])writer.writerow(['1001', '张三', '222'])# 写入多行# data = [('1001', '张三', '21'), ('1002', '李四', '31')]# writer.writerows(data)
我们打开文件看一下结果,如图所示:

reader(csvfile, dialect='excel', **fmtparams)
返回一个 reader 对象,该对象将逐行遍历 csvfile,csvfile 可以是文件对象和列表对象,如果是文件对象要使用 newline='' 打开。看下示例:
>>> import csv>>> with open('test.csv', newline='') as csvfile:>>> reader = csv.reader(csvfile, delimiter=' ')>>> for row in reader:>>> print(', '.join(row))id,name,age1001,张三,222
register_dialect(name[, dialect[, **fmtparams]])
将 name 与 dialect 关联起来。name 必须是字符串,要指定 dialect,可以给出 Dialect 的子类或给出 fmtparams 关键字参数,也可以两者都给出(此时关键字参数会覆盖 dialect 参数)。先来看一下 dialect 和 fmtparams 详细信息,如下所示:
| 属性 | 说明 |
|---|---|
| delimiter | 用于分隔字段的单字符,默认为逗号 |
| doublequote | 控制出现在字段中的引号字符本身应如何被引出,值为 True,双写引号字符,值为 False,则在引号字符的前面放置转义符,默认值为 True |
| quoting | 控制 writer 何时生成引号,以及 reader 何时识别引号 |
| lineterminator | 放在 writer 产生的行的结尾,默认为 '\r\n' |
| quotechar | 一个单字符,用于包住含有特殊字符(如:引号字符、换行符等)的字段,默认为 '"' |
| skipinitialspace | 值为 True,忽略定界符之后的空格,默认为 False |
| strict | 值为 True,则在输入错误的 CSV 时抛出 Error 异常,默认值为 False |
| escapechar | 用于 writer 的单字符,在 quoting 设置为 QUOTE_NONE 的情况下转义定界符,在 doublequote 设置为 False 的情况下转义引号字符,默认为 None,表示禁用转义 |
下面通过一个示例作进一步了解,如下所示:
>>> import csv>>> csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_ALL)>>> with open('test.csv', 'w', newline='') as csvfile:>>> writer = csv.writer(csvfile, 'mydialect')>>> writer.writerow(['id', 'name', 'age'])>>> writer.writerow(['1001', '张三', '222'])>>> with open('test.csv', newline='') as csvfile:>>> reader = csv.reader(csvfile, delimiter=' ')>>> for row in reader:>>> print(', '.join(row))id|"name"|"age"1001|"张三"|"222"
DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
创建一个对象,该对象在操作上类似常规 writer,但会将字典映射到输出行,fieldnames 参数是由键组成的序列,它指定字典中值的顺序,这些值会按指定顺序传递给 writerow() 方法并写入文件;如果字典缺少 fieldnames 中的键,则可选参数 restval 用于指定要写入的值;如果传递给 writerow() 方法的字典的某些键在 fieldnames 中找不到,则可选参数 extrasaction 用于指定要执行的操作,如果将其设置为默认值 'raise',则会引发 ValueError, 如果将其设置为 'ignore',则字典中的其他键值将被忽略;所有其他可选或关键字参数都传递给底层的 writer 实例。看下示例:
>>> import csv>>> with open('test.csv', 'w', newline='') as csvfile:>>> fieldnames = ['id', 'name', 'age']>>> writer = csv.DictWriter(csvfile, fieldnames=fieldnames)>>> writer.writeheader()>>> writer.writerow({'id': '1001', 'name': '张三', 'age': '21'})>>> writer.writerow({'id': '1002', 'name': '李四', 'age': '31'})>>> with open('test.csv', newline='') as csvfile:>>> reader = csv.reader(csvfile, delimiter=' ')>>> for row in reader:>>> print(', '.join(row))id,name,age1001,张三,211002,李四,31
DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
创建一个对象,该对象在操作上类似于常规 reader,但是将每行中的信息映射到一个 dict,该 dict 的键由 fieldnames(是一个序列)可选参数给出,如果省略 fieldnames,则文件第一行中的值将用作字段名;如果某一行中的字段多于字段名,则其余字段将放入列表中,字段名由 restkey 指定(默认为 None),如果非空白行的字段少于字段名,则缺少的值将用 None 填充。看一下示例:
>>> import csv>>> with open('test.csv', newline='') as csvfile:>>> reader = csv.DictReader(csvfile)>>> for row in reader:>>> print(row['id'], row['name'], row['age'])1001 张三 211002 李四 31
Sniffer 类
用于推断 CSV 文件的格式,该类提供了如下两个方法:
sniff(sample, delimiters=None)
分析给定的 sample,如果给出可选的 delimiters 参数,则该参数会被解释为字符串,该字符串包含了可能的有效定界符。
has_header(sample)
分析示例文本(假定为 CSV 格式),如果第一行很可能是一系列列标题,则返回 True。
该类及方法使用较少,了解即可,下面通过一个示例简单了解一下。
import csvwith open('test.csv', newline='') as csvfile:dialect = csv.Sniffer().sniff(csvfile.read(1024))csvfile.seek(0)reader = csv.reader(csvfile, dialect)for row in reader:print(row)
Reader 对象
Reader 对象指 DictReader 实例和 reader() 函数返回的对象,下面看一下其公开属性和方法。
__next__()
返回 reader 的可迭代对象的下一行,返回值可能是列表或字典。
dialect
dialect 描述,只读,供解析器使用。
line_num
源迭代器已经读取了的行数。
fieldnames
字段名称,该属性为 DictReader 对象属性。
Writer 对象
Writer 对象指 DictWriter 实例和 writer() 函数返回的对象,下面看一下其公开属性和方法。
writerow(row)
将参数 row 写入 writer 的文件对象。
writerows(rows)
将 rows*(即能迭代出多个上述 *row 对象的迭代器)中的所有元素写入 writer 的文件对象。
writeheader()
在 writer 的文件对象中,写入一行字段名称,该方法为 DictWriter 对象方法。
dialect
dialect 描述,只读,供 writer 使用。
总结
本文介绍了 CSV 及使用 Python 操作 CSV 文件,能够通过本文的学习对 CSV 有一定了解及通过 Python 实际操作 CSV 文件。
相关文章:
Python 操作 CSV
使用过 CSV 文件都知道:如果我们的电脑中装了 WPS 或 Microsoft Office 的话,.csv 文件默认是被 Excel 打开的,那么什么是 CSV 文件?CSV 文件与 Excel 文件有什么区别?如何通过 Python 来操作 CSV 文件呢?带…...
自动化运维工具Ansible教程(二)【进阶篇】
文章目录 前言Ansible 入门到精通自动化运维工具Ansible教程(一)【入门篇】自动化运维工具Ansible教程(二)【进阶篇】精通篇 进阶篇1. Ansible 的高级主题(例如:角色、动态清单、变量管理等)**1. 角色(Roles)**&#x…...
嵌入式Linux基础学习笔记目录
1. 嵌入式Linux应用开发基础知识 1.1 交叉编译 1.2 GCC编译器 1.3 makefire 1.4 文件I/O 1.5 Framebuffer应用编程 1.6 文字显示及图象显示 1.7 输入系统应用编程 1.8 网络编程 1.9 多线程编程 1.10 串口编程 1.11 I2C应用编程 2. 源码分析 2.1 MQTT源码 2.2 蓝牙源码 2.3 MJP…...
JVM | 垃圾回收器(GC)- Java内存管理的守护者
引言 在编程世界中,有效的内存管理是至关重要的。这不仅确保了应用程序的稳定运行,还可以大大提高性能和响应速度。作为世界上最受欢迎的编程语言之一,通过Java虚拟机内部的垃圾回收器组件来自动管理内存,是成为之一的其中一项必…...
yolov5添加ECA注意力机制
ECA注意力机制简介 论文题目:ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 论文地址:here 基本原理 🐸 ECANet的核心思想是提出了一种不降维的局部跨通道交互策略,有效避免了降维对于通道注意…...
华为在高端智能手机市场再次撕开了一道深深的口子
智能手机市场趋于饱和,增长变得越来越难,智能手机厂商从被动卷走向了主动卷。 8月29日,华为宣布推出“HUAWEI Mate 60 Pro先锋计划”,并于当天中午在官方商城、部分线下门店上线销售新机Mate 60 Pro,它是全球首款支持卫…...
前端设计模式和设计原则之设计模式
作为前端开发,在code时,或多或少地都会践行设计模式,但是你清楚自己用到的是何种设计模式吗? 为什么前端开发一定要懂设计模式呢? code时不遵从设计模式,又能怎样呢? 上面的问题可以留作思考…...
提高在速卖通产品上的曝光率——自养号测评优势全面解析!
速卖通是国际贸易的一个平台,是国内外企业之间的一个桥梁。在速卖通中,如果要让产品得到更好地推广,就必须让产品得到更多的消费者认可。而产品的认可度除了品质保障和售后服务之外,评测也是非常重要的环节。 对于速卖通店铺销量…...
指针进阶(二)
指针进阶 5.函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数案例:使用回调函数,模拟实现qsort(采用冒泡的方式)。案例:测试qsort排序结构体数据 5.函数指针 补: &函数名就是函数的地址 …...
【HCIE】03.BGP高级特性
每一条BGP路由都可以携带多个路径属性,针对其属性也有特有的路由匹配工具,包括:AS Path Filter和Community Filter。 import方向的属性,出现在如策略里面,加入到BGP路由表中,再传给路由表里,出去…...
单个处理数据祖籍列表层级关系
CREATE DEFINERroot% FUNCTION sys_organization_getAncestorsNames(deptId varchar(36)) RETURNS varchar(1000) CHARSET utf8DETERMINISTIC BEGINDECLARE parentDeptId varchar(36) default ; -- 父部门iddeclare parentDeptName varchar(100) default ; -- 父部门名称decla…...
Maven部署打包多环境(开发、测试、生产)配置教程
Maven打包多环境(开发、测试、生产)配置教程 1、多环境配置的必要性1.1 没有进行多环境配置进行的操作复杂性1.2 不影响运行时配置 2、配置方案2.1 添加profile属性2.1 添加两个插件2.3 主配置文件中添加插值变量 3、效果展示3.1 勾选prod环境3.2 控制台…...
【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套
蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空...
【Hello Algorithm】贪心算法
本篇博客介绍: 简单介绍下贪心算法 贪心算法 介绍贪心算法最小字典序的字符串拼接最多会议数切棍子的最小成本IPO灯塔问题 介绍贪心算法 贪心算法是一种极具有自然智慧的算法 它会使用以一种局部最功利的标准来做出一个当前看来最好的选择 如果说我们根据局部最优…...
TOP-K问题
目录 问题描述 解法及思想 第一种方式 算法思想 具体实现 第二种方式 算法思想 具体实现 问题描述 Top-K问题是一个十分经典的问题,一般有以下两种方式来描述问题: 在10亿的数字里,找出其中最大的100个数;在一个包含n个整…...
【保姆级从0到1】UE5 蓝图入门教程1:关卡、蓝图入门
20230113 1、新建项目 新建选择 UE 5.1 项目 选择蓝图,项目位置 改变编辑器布局,选择经典布局 2、关卡与蓝图 选择 File -> New Level 准备创建关卡 选择 Basic,点击 Create 进行创建 Ctrl S 保存新建的关卡 关卡蓝图的打开 鼠标右键&…...
【码银送书第六期】《ChatGPT原理与实战:大型语言模型的算法、技术和私有化》
写在前面 2022年11月30日,ChatGPT模型问世后,立刻在全球范围内掀起了轩然大波。无论AI从业者还是非从业者,都在热议ChatGPT极具冲击力的交互体验和惊人的生成内容。这使得广大群众重新认识到人工智能的潜力和价值。对于AI从业者来说…...
redis 报错 Redis protected-mode 配置文件没有真正启动
(error) DENIED Redis is running in protected mode because protected mode is enabled Redis protected-mode 是3.2 之后加入的新特性,在Redis.conf的注释中,我们可以了解到,他的具体作用和启用条件 链接redis 时只能通过本地localhost …...
解决a标签内容中img标签和p标签垂直方向间隔太大的问题
现象如下: 对应的html结构: 解决办法:给a标签设置:display: inline-block和line-height属性。 然后问题解决: 具体原理如下(由chatgpt回答): display: inline-block 可以减少垂直方…...
如何选择靠谱的全景平台?VR全景加盟从哪方面对比?
VR全景行业经过近几年的发展,已经逐渐普及开来,线下各个行业都有实体商家开始引入VR全景去做营销宣传推广了。不少老板也意识到线上线下双渠道的重要性,而VR全景的存在就刚好满足各行各业的需求,从这一点不难看出,VR全…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
