前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据分析利器 pandas 系列教程(三):读写文件三十六计

数据分析利器 pandas 系列教程(三):读写文件三十六计

作者头像
月小水长
发布2020-06-23 23:55:32
1.7K0
发布2020-06-23 23:55:32
举报
文章被收录于专栏:月小水长

前面我们学完了 pandas 中最重要的两个数据结构: Series DataFrame,今天来侃侃 pandas 读写文件的那些 tricks,我有十足的信心,大家看了定会有所收获。

读写 csv 的正确姿势

假如要保存下面这个 DataFrame

保存到 csv 中,我常用的一行代码是:

代码语言:javascript
复制
df.to_csv('exam_result.csv', index=False, encoding='utf-8-sig')

第一个参数是保存的文件名,第二个参数是不保存 index 索引,第三个参数是指定保存的编码格式为 utf-8-sig

基于实践是检验真理的唯一标准原则,先做一组不保存/保存 index 索引列的对比实验。

保存 index 的 csv

不保存 index 的 csv

再用 pd.read_csv 分别读这两个文件,如果读取了没有保存了 index 索引的,直接用下面这行代码即可:

代码语言:javascript
复制
df = pd.read_csv('exam_result.csv')

如果是读取了保存了 index 索引列的,用上面这句讲道理也不会报错,但是会多出了一个'Unnamed:0'列,稍不注意,就会对 iloc 等后续操作造成影响,所以必须去掉这一列,可加一个参数:

index_col = 0

实现,总结来说,读写 csv,有下面两种组合方式:

代码语言:javascript
复制
# wirte of way1
df.to_csv('exam_result.csv', index=False, encoding='utf-8-sig')
# read  of way1
df = pd.read_csv('exam_result.csv')
代码语言:javascript
复制
# write of way2
df.to_csv('exam_result.csv', encoding='utf-8-sig')
# read  of way2
df = pd.read_csv('exam_result.csv', index_col=0)

至于 encoding 这个参数,为什么取 utf-8-sig 呢?,常见的还有 utf-8,这两者区别联系何在?

  • utf-8 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要 BOM,所以当用 utf-8 编码方式读取带有 BOM 的文件时,它会把 BOM 当做是文件内容来处理, 就会报错。
  • uft-8-sig 中 sig 全拼为 signature 也就是 带有签名的 utf-8,因此 utf-8-sig 读取带有 BOM 的 utf-8 文件时会把 BOM 单独处理,与文本内容隔离开,也是我们期望的结果。

由于 Windows 下如果设置为 utf-8,用 Office Excel 打开的话会发现中文乱码,因为 Excel 默认这个文件是有 BOM 的(BOM 是微软提出的,必然要在自家产品上推广),实际上文件没有 BOM,一来二去就乱码了,使用 utf-8-sig 可以有效避免这个问题。

不止 csv 和 excel

常用的都是 read_csv/to_csv/read_excel/to_excel 这四个来实现读写 csv/excel,实际上常用的还有 json html 两种形式。

json 读写示例
代码语言:javascript
复制
df.to_json('exam_result.json')
df = pd.read_json('exam_result.json')

exam_result.json 内容如下:

实际上所有的内容都在一行,为了方便截图,我展开成了六行;其中 '0','1' 等是 index 而不是下标,注意区分。

html 读写示例
代码语言:javascript
复制
df.to_html('exam_result.html')
df = pd.read_html('exam_result.html')

exam_result.html 用浏览器打开如下:

为什么叫 csv

csv 全称 Comma Separated Values,即逗号分隔值,见名知意,每行各个字段是以逗号分隔的。

常见的还有 tsv,即 Tab 制表符分隔,其实,这个分隔符,我们可以自定义,以 !、&、@ 等字段值中几乎不会出现的字符为宜,如果是字母 a、b、c,容易造成混乱。无论是 csv、tsv 还是 ?sv,都封装在 read_csv() 函数中,以 sep 参数值作为区分。

代码语言:javascript
复制
df.to_csv('exam_result.msv', sep='@', index=False, encoding='utf-8-sig')
df = pd.read_csv('exam_result.msv', sep='@')

msv 后缀是我随便起的,只要保证读写文件名相同即可。

读不太规范的 csv

一个不格式太规范的 csv 举例如下:

不规范之处在于内容没有从表格的左上角开始,如果用常用的· df =pd.read_csv('exam_result.csv')这样读,打印的 dataframe 如下:

这个时候,参数 skiprows(跳过前几行)和 usecols (只取哪些列) 就派上用场了。

代码语言:javascript
复制
df = pd.read_csv('exam_result.csv', skiprows=2,usecols=['name','sex','course','grade'])

活学活用,利用 usecols,还可以解决前面所说的读取保存了 index 的 csv,出现'Unnamed:0' 的问题。

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

本文分享自 月小水长 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 读写 csv 的正确姿势
  • 不止 csv 和 excel
    • json 读写示例
      • html 读写示例
        • 为什么叫 csv
        • 读不太规范的 csv
        相关产品与服务
        文件存储
        文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档