Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CSV文件存储

CSV文件存储

作者头像
不可言诉的深渊
发布于 2019-07-26 09:19:15
发布于 2019-07-26 09:19:15
5.3K00
代码可运行
举报
运行总次数:0
代码可运行

CSV ,全称为 Comma-Separated Values ,中文可以叫逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比 Excel 文件更加简洁, XLS 文本是电子表格,它包含了文本、数值、公式和格式等内容,而 CSV 中不包含这些内容,就是特定字符分割的纯文本,结构简单清晰。

写入

这里先看一个最简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'w')as csvfile:
      writer = csv.writer(csvfile)
      writer.writerow(['id', 'name', 'age'])
      writer.writerow(['10001', 'Mike', 20])
      writer.writerow(['10002', 'Bob', 22])
      writer.writerow(['10003', 'Jordan', 21])

首先,打开 data.csv 文件,然后指定打开的模式为 w (即写入),获得文件句柄,随后调用 csv 库的 writer() 方法初始化写入对象,传入该句柄,然后调用 writerow() 方法传入每行的数据即可完成写入。

运行结束后,会生成一个 data.csv 的文件,此时数据就成功写入了,直接以文本形式打开的话,其内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  id,name,age
  
  10001,Mike,20
  
  10002,Bob,22
  
  10003,Jordan,21

我们可以发现每条记录中间都空了一行,这可不太好啊!那么如何解决这个问题呢?首先从 open 方法入手,我们先查看一下 open 方法,打开命令提示符输入 python 或 ipython 回车进交互式解释器环境。然后直接输入 help(open) 回车,如图所示。

首先看这个函数的原型, 1 个必选参数, 7 个默认参数,我们注意到其中一个默认参数是 newline ,引起上面的结果出现空行可能就是因为它了,我们往下滑,找到对 newline 参数的解释,如图所示。

稍微翻译一下, newline 控制全局的换行如何工作(它仅仅应用于文本模式)。它可以是None,‘’,‘\n’,‘\r’ 和 ‘\r\n’。它按照如下方式工作:

  • 在输入时,如果 newline 是 None ,全局的换行模式是可用的,输入中的行可以以 ‘\n’,‘\r’ 或者 ‘\r\n’ 结尾,并且在被返回给调用者之前,这些会被解释成 ‘\n’ 。如果它是空字符串,全局换行模式也是可用的,但是每一行的结束符都会原封不动的返回给调用者。如果它有其他任何合法的值,输入的行仅仅按照被传入的字符串来终止,并且行的结束符被原封不动的返回给调用者。
  • 在输出时,如果 newline 是 None ,任何被写入的 ‘\n’ 字符会被解释成系统默认的行分隔符, os.linesep 。如果 newline 是 ‘’ 或者 ‘\n’ ,就没有解释发生。如果 newline 是任何其他合法的值,任何被写入的 ‘\n’ 字符被解释给传入的字符串。

简直是云里雾里啊~!这里看不懂没有关系,我们去看一下 csv 的官方文档(https://docs.python.org/3/library/csv.html#id3),找到如图所示的位置。

上面是 csv 模块的 writer 的函数原型,稍微翻译一下下面一段:

返回一个编写器对象,负责将用户的数据转换为给定类似文件的对象上的分隔字符串。 csvfile 可以是任何拥有写方法的对象。如果 csvfile 是一个文件对象,它应该伴随着 newline 参数为空字符串的过程被打开。……为什么呢?点击上面的 [1] 跳到最下面的注释部分,如图所示。

如果 newline=‘’ 没有被规定,嵌入在引号字段中的换行符将无法正确解释,并且在使用 \r\n 行尾的平台上将添加额外的 \r 。由于 csv 模块遵循它自己的换行处理标准,规定 newline=‘’ 总归是安全的。

按照官方文档所说的内容,我们修改上面的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'w', newline='')as csvfile:
      writer = csv.writer(csvfile)
      writer.writerow(['id', 'name', 'age'])
      writer.writerow(['10001', 'Mike', 20])
      writer.writerow(['10002', 'Bob', 22])
      writer.writerow(['10003', 'Jordan', 21])

再次运行一下,然后去看看文件内容,其内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  id,name,age
  10001,Mike,20
  10002,Bob,22
  10003,Jordan,21

终于成功了!可以看到,写入的文本默认以逗号分隔,调用一次 writerow() 方法即可写入一行数据。用 Excel 打开的结果如图所示。

如果想修改列与列之间的分隔符,可以传入 delimiter 参数,其代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'w', newline='')as csvfile:
      writer = csv.writer(csvfile, delimiter=' ')
      writer.writerow(['id', 'name', 'age'])
      writer.writerow(['10001', 'Mike', 20])
      writer.writerow(['10002', 'Bob', 22])
      writer.writerow(['10003', 'Jordan', 21])

在这里初始化写入对象时传入 delimiter 参数为空格,此时输出结果的每一列就是以空格分隔了,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  id name age
  10001 Mike 20
  10002 Bob 22
  10003 Jordan 21

另外,我们也可以调用 writerows() 方法写入多行,此时参数就需要为二维列表,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'w', newline='')as csvfile:
      writer = csv.writer(csvfile)
      writer.writerow(['id', 'name', 'age'])
      writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

输出效果是相同的,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  id,name,age
  10001,Mike,20
  10002,Bob,22
  10003,Jordan,21

但是一般情况下,爬虫爬取的都是结构化数据,我们一般会用字典来表示。在 csv 库中也提供了字典的写入方式,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'w', newline='')as csvfile:
      fieldnames = ['id', 'name', 'age']
      writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
      writer.writeheader()
      writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
      writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
      writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

这里先定义 3 个字段,用 fieldnames 表示,然后将其传给 DictWriter 来初始化一个字典写入对象,接着可以调用 writeheader() 方法先写入头信息,然后再调用 writerow() 方法传入相应字典即可。最终写入的结果是完全相同的,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  id,name,age
  10001,Mike,20
  10002,Bob,22
  10003,Jordan,21

这样就可以完成字典到 csv 文件的写入了。

另外,如果想追加写入的话,可以修改文件的打开模式,即将 open() 函数的第二个参数改成 a ,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'a', newline='')as csvfile:
      fieldnames = ['id', 'name', 'age']
      writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
      writer.writerow({'id': '10004', 'name': 'Durant', 'age': 22})

这样在上面的基础上再执行这段代码,文件内容便会变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  id,name,age
  10001,Mike,20
  10002,Bob,22
  10003,Jordan,21
  10004,Durant,22

可见,数据被追加写到文件中。

如果要写入中文内容的话,可能会遇到字符编码的问题,此时需要给 open 参数指定编码格式。比如,这里再写入一行包含中文的数据,代码需要改写如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'a', encoding='utf-8', newline='')as csvfile:
      fieldnames = ['id', 'name', 'age']
      writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
      writer.writerow({'id': '10005', 'name': '王伟', 'age': 22})

这里需要给 open() 函数指定编码,否则可能发生编码错误。

另外,如果接触过 pandas 等库的话,可以调用 DataFrame 对象的 to_csv() 方法来将数据写入 CSV 文件中。

读取

我们同样可以使用 csv 库来读取 CSV 文件。例如,将刚才写入的文件内容读出来,相关代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import csv
  with open('data.csv', 'r', encoding='utf-8')as csvfile:
      reader = csv.reader(csvfile)
      for row in reader:
          print(row)

运行结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  ['id', 'name', 'age']
  ['10001', 'Mike', '20']
  ['10002', 'Bob', '22']
  ['10003', 'Jordan', '21']
  ['10004', 'Durant', '22']
  ['10005', '王伟', '22']

这里我们构造的是 Reader 对象,通过遍历输出了每行的内容,每一行都是一个列表形式。注意,如果 CSV 文件包含中文的话,还需要指定文件编码。

另外,如果接触过 pandas 的话,可以利用 read_csv() 方法将数据从 CSV 中读取出来,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import pandas as pd
  df = pd.read_csv('data.csv')
  print(df)

运行结果如下:

我们可以发现中文没有对齐,感觉有点怪怪的~!我们首先需要知道为什么没有对齐。它之所以没有对齐,是因为它以最长的字符串为标准进行右对齐的,同时又因为汉字是宽字符(占用两个字符的位置),它现在还是以为中文汉字只有占一个字符位。如何解决这个问题呢?其实很简单,设置属性 display.unicode.ambiguous_as_wide 和 display.unicode.east_asian_width ,将这两个属性都设置为 True 即可,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import pandas as pd
  pd.set_option('display.unicode.ambiguous_as_wide', True)
  pd.set_option('display.unicode.east_asian_width', True)
  df = pd.read_csv('data.csv')
  print(df)

运行结果如下:

在做数据分析的时候,此种方法用的比较多,也是一种比较方便地读取 CSV 文件的方法。

我们了解了 CSV 文件的写入和读取方式。这也是一种常用的数据存储方式,需要熟练掌握。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python爬虫之文件存储#5
文件存储形式多种多样,比如可以保存成 TXT 纯文本形式,也可以保存为 JSON 格式、CSV 格式等,本节就来了解一下文本文件的存储方式。
仲君Johnny
2024/02/10
2180
Python爬虫之文件存储#5
CSV文件
CSV文件:Comma-Separated Values,中文叫,逗号分隔值或者字符分割值,其文件以纯文本的形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分割。每条记录由字段组成,字段间的分隔符是其他字符或者字符串。所有的记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。 用文本文件、EXcel或者类似与文本文件的都可以打开CSV文件。
狼啸风云
2020/02/11
2.7K0
Python数据格式-CSV
CSV文件:Comma-Separated Values,中文叫,逗号分隔值或者字符分割值,其文件以纯文本的形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分割。每条记录由字段组成,字段间的分隔符是其他字符或者字符串。所有的记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。 用文本文件、EXcel或者类似与文本文件的都可以打开CSV文件。 写入CSV 在Python中把数据写入CSV文件,示例如下: import csv #需要导入库 with open
Python研究者
2020/09/28
1.1K0
Python数据格式-CSV
Python爬虫:保姆级教你完成数据存储
在上面的几篇文章当中都有实战项目进行配合,帮助各位看我的文章的小伙伴可以亲切的感受到爬虫的乐趣。在实战的过程当中很多时候也会将数据保存起来放在Excel文件或者是文本文件当中,但是却没有对数据的存储做详细的介绍,因此本次文章我就打算为大家带来数据存储的保姆级教程!
我被狗咬了
2021/02/25
2.7K0
Python爬虫:保姆级教你完成数据存储
爬虫学习(16):CSV文件存储
写入: import csv with open('data.csv','w',encoding='gbk') as f: #如果是csv一定要用gbk编译方式,utf-8乱码 writer=csv.writer(f)#writer方法初始化写入对象 writer.writerow(['id','name','age'])#writerow写入每一行数据 writer.writerow(['1','川川','20']) writer.writerow(['3','笨笨','
川川菜鸟
2021/10/18
2550
python爬虫系列之数据的存储(二):csv库的使用
上一篇我们讲了怎么用 json格式保存数据,这一篇我们来看看如何用 csv模块进行数据读写。
渔父歌
2018/09/28
2.3K0
python爬虫系列之数据的存储(二):csv库的使用
详解Python操作csv模块
csv文件是一种很好的文件格式,可以作excel打开,也可以作txt文件,方便git跟踪数据变化
用户10002156
2023/08/07
6580
详解Python操作csv模块
CSV
写出这篇文章的原因主要是最近在看一本书《Python爬虫开发与实战-从入门到实战》里面提到了CSV这个模块,我立马进行了尝试,发现非常好用,比之前的xlwt好用多了。
皮大大
2021/03/01
1.7K0
CSV
[接口测试 - 基础篇] 09 其实吧,读写csv格式也是要掌握的
什么是csv格式 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 CSV文件由任意数目的记录组成,记录间以某种换行符分隔; 每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。 所有记录都有完全相同的字段序列,通常都是纯文本文件。 建议用nodepad++、sublime等编辑器进行编辑。 csv格式规则 开头是不留空,以行为单位。 可含或不含列名,含列名则居文件第
苦叶子
2018/04/09
1.7K0
Python输出csv、excel表格
在机器学习应用过程中,最重要的部分之一是数据可视化。换句话,如何说服别人或者自己? 环境:python3.5
py3study
2020/01/07
4.1K0
零基础入门Python·数据分析先导篇——CSV/JSON互转
Python的csv模块是一个强大的库,用于处理CSV(逗号分隔值)文件。它是Python标准库的一部分,因此不需要安装任何额外的包就可以使用。csv模块提供了一系列功能,使得读取和写入CSV文件变得非常简单和直接。它支持各种自定义选项,包括自定义分隔符、引号处理、行结束符等,使其能够处理各种不同格式的CSV文件。
用户6256742
2024/08/01
2500
python读写csv文件
文件读写的经典操作方式如下,通过内置的open函读取到每行内容,按照指定的分隔符进行分隔,然后对每一列的内容进行处理。这样的方式在处理制表符分隔的文件时,没什么问题,但是在处理csv文件时,会非常的头痛。
生信修炼手册
2020/05/13
1.8K0
关于python读写csv表格的例子
CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。
python与大数据分析
2022/03/11
6600
关于python读写csv表格的例子
【python】使用csv库以字典格式读写csv文件
1、使用csv.DictWriter()写入字典格式的数据 import csv with open('test.csv', 'w', newline='') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first
西西嘛呦
2020/08/26
1.8K0
【python】使用csv库以字典格式读写csv文件
【python基础教程】csv文件的写入与读取
CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符。很多程序在处理数据时都会碰到csv这种格式的文件。python自带了csv模块,专门用于处理csv文件的读取
hacker707
2022/11/27
5.6K0
【python基础教程】csv文件的写入与读取
python csv文件处理
这样操作,以后获取数据的时候,就要通过下表来获取数据。如果想要在获取数据的时候通过标题来获取。那么可以使用DictReader。示例代码如下:
用户2200417
2022/03/02
2.2K0
Python写入文件内容:从入门到精通
在日常编程工作中,我们常常会遇到需要将数据保存至磁盘的需求。无论是日志记录、配置文件管理还是数据持久化,掌握如何有效地使用Python来写入文件内容都是必不可少的一项技能。本文将从基础语法开始,逐步深入探讨Python中写入文件内容的各种技巧,并通过具体的实例帮助你快速上手,直至能够应对复杂的实际场景。
阿珍
2024/10/11
3890
Python写入文件内容:从入门到精通
在python中使用csv读写CSV 原
1.一般读写方式 # 读取csv文件 import csv with open('some.csv', 'rb') as f: # 采用b的方式处理可以省去很多问题 reader = csv.reader(f) for row in reader: # do something with row, such as row[0],row[1] import csv with open('some.csv', 'wb') as f: # 采用b的方式
晓歌
2018/08/15
1.2K0
Python学习:读取csv文件
CSV是Conma Sepatrate Values(逗号分隔值)的缩写,文档的内容是由‘,’分隔的一列列数据构成的。CSV格式是电子表格和数据库最常用的导入和导出格式。 CSV模块实现了以CSV格式读取和写入表格数据,它允许程序员以Excel首选格式写入数据,或者从Excel生成的文件中读取数据。
烤粽子
2021/07/07
2.8K0
Python学习:读取csv文件
在python中读取和写入CSV文件(你真的会吗?)「建议收藏」
注意,打开文件时应指定格式为w, 文本写入. 打开文件时,指定不自动添加新行newline=‘’,否则每写入一行就或多一个空行。
全栈程序员站长
2022/09/16
5.5K0
在python中读取和写入CSV文件(你真的会吗?)「建议收藏」
相关推荐
Python爬虫之文件存储#5
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验