当前位置: 首页 > news >正文

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 工具打开,那他们有什么区别呢?我们通过下表简单了解一下。

CSVExcel
文件后缀为 .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 csv
with 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 csv
with 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从业者来说&#xf…...

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全…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

[10-1]I2C通信协议 江协科技学习笔记(17个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17...

JS设计模式(5): 发布订阅模式

解锁JavaScript发布订阅模式:让代码沟通更优雅 在JavaScript的世界里,我们常常会遇到这样的场景:多个模块之间需要相互通信,但是又不想让它们产生过于紧密的耦合。这时候,发布订阅模式就像一位优雅的信使,…...

【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级

概述 在历经半个月的间歇性开发后,RagflowPlus再次迎来一轮升级,正式发布v0.4.0。 开源地址:https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码: git clone https://github.com/zstar1003/ragflow-plus.…...