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

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


读写 csv 的正确姿势

假如要保存下面这个 DataFrame


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

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 索引的,直接用下面这行代码即可:

df = pd.read_csv('exam_result.csv')

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

index_col = 0 

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

# 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')
# 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 读写示例
df.to_json('exam_result.json')
df = pd.read_json('exam_result.json')

exam_result.json 内容如下:


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

html 读写示例
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 参数值作为区分。

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 (只取哪些列) 就派上用场了。

df = pd.read_csv('exam_result.csv', skiprows=2,usecols=['name','sex','course','grade'])

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

python爬虫人工智能大数据公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值