Python 操作 CSV

news2025/1/9 16:22:28

使用过 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 文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建开机自启的脚本

在启动许多ros节点时有多种方式,我推荐使用launch来启动所有的节点,这也是一种规范的方式。以后会慢慢向这个方向靠。 除此之外还可以通过创建的脚本来启动: 脚本位置不限,只需要: sudo gedit xxx.sh在里面添加相应的…

网站框架识别方法

cms一般有dedecms(织梦),dzcms,phpweb,phpwind,phpcms,ecshop,dvbbs,siteweaver,aspcms,帝国,zblog,wordpress等。 一般cms都有特定的…

ES6——知识点记录

这里写目录标题 1.字符串支持1.codePointAt——根据字符串码元的位置得到其码点2.includes——判断字符串中是否包含指定的子字符串3.startsWith——判断字符串中是否以指定的字符串开始4.endsWith——判断字符串中是否以指定的字符串结尾5.repeat——将字符串重复指定的次数&a…

AB试验(二)统计基础

AB试验(二)统计基础 随机变量 均值类指标:如用户的平均使用时⻓、平均购买金额、平均购买频率等 概率类指标:如用户点击的概率(点击率)、转化的概率(转化率)、购买的概率 (购买率)等 经验结论:在数量足够大时&#…

Vibro-meter VM600 200-510-041-021数字量控制板卡

Vibro-meter VM600 200-510-041-021 数字量控制模块通常用于振动监测和机械设备的控制系统中,以执行振动数据采集、分析和控制任务。以下是通常情况下数字量控制模块的一些产品特点: 多通道输入:这些模块通常配备多个输入通道,以接…

浅析数字孪生在科学研究中的作用和优势

在科学研究领域,数字孪生技术正迅速崭露头角,为研究人员提供了前所未有的工具和资源,以更深入、更全面地理解复杂的自然现象和系统。本文带大家探讨数字孪生对科学研究的作用: 1. 精准建模和仿真 数字孪生技术允许科学家创建真实…

【Minecraft】Lucky Block(幸运方块)mod介绍

文章目录 mod介绍支持版本mod作者合成方式幸运值使用方法总结 mod介绍 幸运方块模组虽然只是添加了一个方块,两种武器,一种药水,但拥有超过一百种可能性! 简单地打破幸运方块,它将开出意想不到的东西! 你可…

云原生安全性:构建可信任的云应用的最佳实践

文章目录 云原生安全性的重要性1. 数据隐私2. 恶意攻击3. 合规性要求4. 业务连续性 构建可信任的云应用的最佳实践1. 安全开发2. 身份验证与授权3. 容器安全性4. 监控与审计5. 持续集成与持续交付(CI/CD)6. 安全培训和教育 未来趋势:服务网格…

Swagger 使用教程

Swagger 官网&#xff1a; API Documentation & Design Tools for Teams | Swagger 整合swagger 依赖&#xff1a; springfox-swagger2 springfox-swagger-ui <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</a…

气象站:从气候预测到环境监测

在我们的日常生活中&#xff0c;气象站的存在可能并不显眼&#xff0c;但实际上&#xff0c;它对我们的生活产生了重要的影响。气象站是一种用于收集和监测天气数据的设施&#xff0c;通过它&#xff0c;我们可以获得各种关于气候和天气的宝贵信息。那么&#xff0c;气象站可以…

Selenium自动化测试框架常见异常分析及解决方法

01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …

飞行动力学 - 第20节-横向静稳定性 之 基础点摘要

飞行动力学 - 第20节-横向静稳定性 之 基础点摘要 1. 横向静稳定性2. 横向静稳定准则3. 横向静稳定性的组成4. 参考资料 1. 横向静稳定性 2. 横向静稳定准则 对于横向静稳定性飞机&#xff0c;右滚转扰动会产生正侧滑&#xff0c;飞机产生左滚恢复力矩(负)&#xff0c;即 Δ …

Python之数据库(MYSQL)连接

一&#xff09;数据库SQL语言基础 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database…

想入行视觉设计?先看这篇文章再说!

大家好我是设计师不知名设计师l1m0&#xff0c;今天要给大家分享的设计岗位是&#xff1a;视觉设计师。 在当今数字化时代&#xff0c;视觉设计师扮演着至关重要的角色。他们是创意世界的魔术师&#xff0c;通过各种视觉元素的精妙组合&#xff0c;为品牌、产品和项目赋予生命…

【微信读书】数据内容接口逆向调试02

需求爬取微信读书的某一本书的整本书的内容 增强需求&#xff0c;大批量爬取一批书籍内容 众所周知微信读书是一个很好用的app&#xff0c;他上面书籍的格式很好&#xff0c;质量很高。 本人充值了会员但是看完做完笔记每次还得去翻很不方便&#xff0c;于是想把书籍内容弄下…

专注写作,快速上线:Cpolar+Inis帮助你在Ubuntu上建立博客网站

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

信息系统项目管理师(第四版)教材精读思维导图-第十一章项目成本管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 11.1 管理基础 11.2 管理过程 11.3 规划成本管…

2023-简单点-怎么知道树莓派是什么cpu架构?

树莓派是几位&#xff1f; getconf LONG_BIT https://qengineering.eu/install-ncnn-on-raspberry-pi-4.html

Redis过期时间的思考

当我们把 Redis 当做缓存来使用时&#xff0c;设置过期时间是必须的&#xff0c;但具体设置多少的过期时间呢&#xff0c;针对不同的场景会有不同的决策。 虚假一个场景&#xff0c;我们基于用户的地理位置推荐附近的陌生主播&#xff0c;用户可以线下去找主播沟通。当系统第一…

【网络技术】心跳机制(入门讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…