本篇我们介绍如何使用 Python 内置的 csv 模块读取 CSV 文件。

CSV 文件

CSV 代表逗号分隔值(comma-separated values),CSV 文件就是使用逗号分隔数据的文本文件。

一个 CSV 文件包含一行或多行数据,每一行数据代表一个记录。每个记录包含一个或多个数值,使用逗号进行分隔。另外,一个 CSV 文件中的所有数据行都包含相同数量的值。

我们通常使用 CSV 文件存储表格数据,很多软件都支持这种文件格式,例如 Microsoft Excel 和 Google Spreadsheet。

读取 CSV 文件

在 Python 代码中读取 CSV 文件的步骤如下:

首先,导入 csv 模块:

import csv

其次,使用内置的 open() 函数以读取模式打开文件:

f = open('path/to/csv_file')

如果 CSV 文件中包含 UTF8 编码字符,可以指定 encoding 参数:

f = open('path/to/csv_file', encoding='UTF8')

然后,将文件对象 f 传递给 csv 模块的 reader() 函数,该函数返回一个 csv reader 对象:

csv_reader = csv.reader(f)

csv_reader 是一个可遍历对象,由 CSV 文件中的数据行组成。因此,我们可以使用 for 循环遍历 CSV 文件中的数据行:

for line in csv_reader:print(line)

每一行都是一个列表,如果想要访问具体的数据,可以使用方括号([])指定数据的下标。第一个数值的下标为 0,第二个数值的下标为 1,依次类推。

例如,以下代码表示访问一行数据中的第一个值:

line[0]

最后,调用 close() 方法关闭文件:

f.close()

或者也可以使用 with 语句自动关闭文件。以下是读取 CSV 文件的完整代码:

import csvwith open('path/to/csv_file', 'r') as f:csv_reader = csv.reader(f)for line in csv_reader:# process each lineprint(line)

示例

示例文件 score.csv 的内容如下:

id,stu_id,coursename,coursescore
1,1,English,100
2,1,Math,95
3,2,English,96
4,2,Math,95
5,3,English,100
6,3,Math,99
7,4,English,98
8,4,Math,97
9,5,English,99
10,5,Math,95
11,6,English,96
12,6,Math,94
13,7,English,92
14,7,Math,100
15,8,English,97
16,8,Math,95

下面的示例读取了该文件并打印文件中的内容:

import csvwith open('score.csv', encoding="utf8") as f:csv_reader = csv.reader(f)for line in csv_reader:print(line)

输出结果如下:

['id', 'stu_id', 'coursename', 'coursescore']
['1', '1', 'English', '100']
['2', '1', 'Math', '95']
['3', '2', 'English', '96']
['4', '2', 'Math', '95']
['5', '3', 'English', '100']
...

score.csv 文件中的第一行是标题。为了区分标题和数据,我们可以使用 enumerate() 函数获取每一行的下标:

import csvwith open('score.csv', encoding="utf8") as f:csv_reader = csv.reader(f)for line_no, line in enumerate(csv_reader, 1):if line_no == 1:print('Header:')print(line)  # headerprint('Data:')else:print(line)  # data

以上示例中,我们使用了 enumerate() 函数并且将第一行的下标设置为 1。在循环内部,如果 line_no 为 1,表示当前行为标题;否则,当前行是数据。代码输出的结果如下:

Header:
['id', 'stu_id', 'coursename', 'coursescore']
Data:
['1', '1', 'English', '100']
['2', '1', 'Math', '95']
['3', '2', 'English', '96']
['4', '2', 'Math', '95']
['5', '3', 'English', '100']
...

跳过标题行的另一个方法就是使用 next() 函数,该函数表示读取到下一行。例如:

import csvwith open('score.csv', encoding="utf8") as f:csv_reader = csv.reader(f)# skip the first rownext(csv_reader)# show the datafor line in csv_reader:print(line)

以下示例读取 score.csv 文件并计算所有成绩的总和:

import csvtotal_score = 0with open('score.csv', encoding="utf8") as f:csv_reader = csv.reader(f)# skip the headernext(csv_reader)# calculate totalfor line in csv_reader:total_score += int(line[3])print(total_score)

输出结果如下:

1548

DictReader 类

当我们使用 csv.reader() 函数是,可以利用下标访问 CSV 文件中的数据,例如 line[0]、line[1] 等等。不过,使用该函数有两个主要的局限性:

  • 首先,访问数据的方式不明显。例如,line[3] 代表了成绩。如果我们能够使用 line[‘coursescore’] 访问数据,显然含义更加清晰。
  • 其次,当 CSV 文件中的字段顺序发生了改变,或者增加了新的字段,我们需要修改代码。

DictReader 类可以解决这些问题,而且它也来自 csv 模块。

DictReader 类可以创建一个类似普通 CSV reader 的对象,但是它将每行数据的信息映射成了一个字典(dict),key 的值由第一行数据指定。

通过使用 DictReader 类,我们可以使用 line[‘stu_id’]、line[‘coursename’] 等方式访问 score.csv 文件中的数据,例如:

import csvwith open('score.csv', encoding="utf8") as f:csv_reader = csv.DictReader(f)# show the datafor line in csv_reader:print(f"The {line['coursename']} score of {line['stu_id']} is {line['coursescore']}")

输出结果如下:

The English score of 1 is 100
The Math score of 1 is 95
The English score of 2 is 96
The Math score of 2 is 95
...

如果我们想要使用自定义的字段名,而不是 CSV 文件中第一行指定的字段名,可以在 DictReader() 构造函数中指定:

import csvfieldnames = ['id', '学生编号', '课程', '成绩']with open('score.csv', encoding="utf8") as f:csv_reader = csv.DictReader(f, fieldnames)next(csv_reader)for line in csv_reader:print(f"The {line['课程']} score of {line['学生编号']} is {line['成绩']}")

总结

  • csv.reader() 函数和 csv.DictReader 类都可以用于读取 CSV 文件。

【Python入门教程】第72篇 读取CSV文件相关推荐

  1. c#读取csv文件成DataTable,将DataTable数据存储为csv格式文件

    全栈工程师开发手册 (作者:栾鹏) c#教程全解 c#读取csv文件成DataTable,将DataTable数据存储为csv格式文件, 测试代码 static void Main() {//自定义数 ...

  2. python实现登录支付宝收能量_适合零基础人群学习的Python入门教程

    适合零基础人群学习的Python入门教程学什么?小编为大家准备的Python学习教程,课程主要讲解:Python核心编程.Linux基础.前端开发.Web开发.爬虫开发.人工智能等内容. 对于初学者想 ...

  3. python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结

    原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...

  4. python csv文件读取行列_使用Numpy读取CSV文件,并进行行列删除的操作方法

    Numpy是Python强大的数据计算和处理模块,其操作数据非常迅速且简单易行. 首先读取CSV文件 >>> import numpy as np#导入numpy模块 >> ...

  5. python入门教程(非常详细)-菜鸟学Python入门教程大盘点|7个多月的心血总结

    原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...

  6. Python入门教程详解

    Python入门教程 目录 1. 简介 2. 安装 3. 基本语法 4. 数据类型 5. 条件语句 6. 循环 7. 函数 8. 模块 9. 异常处理 10. 文件输入输出 1. 简介 Python是 ...

  7. python pandas读取csv文件指定行_python pandas获取csv指定行 列的操作方法

    python pandas获取csv指定行 列的操作方法 pandas获取csv指定行,列 house_info = pd.read_csv('house_info.csv') 1:取行的操作: ho ...

  8. Python基础教程,Python入门教程

    Python 是一门上手简单.功能强大.通用型的脚本编程语言.Python 类库极其丰富,这使得 Python 几乎无所不能,网站开发.软件开发.大数据分析.网络爬虫.机器学习等都不在话下. 这套 P ...

  9. 技术图文:C# VS. Python 读取CSV文件指南

    背景 CSV 是一种以逗号进行特征分隔的文本文件类型,在数据库或电子表格中是一种非常常见的导入导出格式.本篇图文就以泰坦尼克号船员获救预测( Kaggle)中使用的数据集为例来说明 C#.Python ...

最新文章

  1. 一句话总结LLE(流形学习)
  2. java动态sql执行数据
  3. php dns刷新,Windows DNS缓存自动刷新
  4. Duplicate Observed Data(复制“被监视数据”)
  5. ftp 批量上传文件命令
  6. 大学英语 计算机应用基础,计算机应用基础-大学英语b.doc
  7. quartus仿真14:D触发器实现序列检测
  8. 景观生态学概述[转载]
  9. 面向对象编程——2.细致了解
  10. Winson.Framework 1.5发布!
  11. VRay渲染器之家装户型渲染实战记录
  12. 电容器充放电的原理是什么?
  13. 注册免费许可证试用 PowerApps
  14. 预装WIN8的电脑是GPT分区模式,无法安装WIN7
  15. STM32的延迟函数1us、1ms
  16. 【干货】从QQ群起家的情趣商城站长之路
  17. VS2010 中修改项目名称
  18. oracle高可用培训,企业级Oracle数据库高可用性(OracleDataGuard)DBA培训视频全集
  19. AD使用技巧——如何改变布线走线的角度
  20. 最简单深度学习Python实现(二分类问题)

热门文章

  1. 中国高端旅游人群洞察报告.pdf
  2. VritualBox Centos 与主机复制粘贴问题解决
  3. Linux更改家目录
  4. 阿里巴巴/166获得店铺的所有商品 API使用说明
  5. 2022年自学Python的万能神器,超有用
  6. OpenCVSharp(C# OpenCV)图像去水印实例
  7. VSCode官网下载慢问题解决
  8. Redis以及Redis的php扩展安装
  9. 内联函数 —— C 中关键字 inline 用法解析(转载)
  10. 【Git命令】Git常用命令速查 Git命令汇总