从 JavaScript 角度学 Python(20) - CSV

前言

前一章节简单的聊了一下 JSON 之後,接下来我想额外补充一个关於 CSV 档案处理的部分,而 CSV 通常在批次汇入的时候会很常看到,所以就特别拉一篇来聊聊。

who is CSV

通常看到 CSV 档案的时候,大多人会觉得它是一个 Excel 或是 Google 试算表也不爲过,毕竟通常我们开启 CSV 就是使用这几种软件去打开,我以前还以为 CSV 就是 Excel,还傻傻的问说 CSV 档该怎麽打开。

应该是我太笨了吧?对吧?还是你也跟我一样一开始以为 CSV 只是单纯的 Excel 格式的一种呢?下面留言给我吧,让我知道我不孤单。

https://ithelp.ithome.com.tw/upload/images/20210920/20119486NQyKJG1B8z.png

好,那麽什麽是 CSV 呢?CSV 是 Comma-Separated Values 的缩写(我破英文觉得难念),中文名称是「逗号分隔值」,顾名思义就是使用逗号去做分隔每一个值的,通常第一排会是栏位名称:

name,title,url
ray,Welcome.Web.World,https://hsiangfeng.github.io/

因此其实你使用 .txt 来撰写也是可以达到相同效果,毕竟 CSV 就是一个纯文字的档案,因此你可以尝试建立一个纯文字档案,然後写入下方内容:

name,title,url
ray,Welcome.Web.World,https://hsiangfeng.github.io/

接下来存档!再将副档名改成 .csv,在去打开,你会发现是可以正常运作的,是不是超简单的~

https://ithelp.ithome.com.tw/upload/images/20210920/201194866YOcFClnCD.png

因此如果你有使用一些批量汇入的服务,你也可以发现大多都是支援 .csv 与 .txt 哩~

那麽为什麽要特别讲到 CSV 呢?就如同前面所言,许多系统都会支援 .csv 批次汇入,甚至你也可以看到一些爬虫爬完资料之後就转换成 CSV 格式,然後再上传到自己的分析系统,所以好 CSV 不了解一下怎麽在 Python 中如何使用吗?

https://ithelp.ithome.com.tw/upload/images/20210920/20119486ZjB3Gm7QBR.png

读取 CSV

那麽首先我们先学如何读取 CSV 当作起手式,因此我这边有准备有一个简易版的 .csv 档,分别栏位是名字、标题与网址:

name,title,url
ray,Welcome.Web.World,https://hsiangfeng.github.io/
ray,第-13-届-iT邦帮忙铁人赛,https://hsiangfeng.github.io/tags/第-13-届-iT邦帮忙铁人赛/

蛤?你问我范例的 .csv 哪里下载?我刚刚不是已经教你怎麽建立 csv 了吗?

https://ithelp.ithome.com.tw/upload/images/20210920/20119486TGmSeJ7odS.png

简单来讲,你先建立一个 .txt 的文字档案,然後填入我上面给的内容,再将副档名改成 .csv 就可以罗。

那麽当你建立好後使用 Excel 或是 Google 试算表打开会像这样子呈现:

https://ithelp.ithome.com.tw/upload/images/20210920/201194862wuiK6OdIF.png

题外话一下你可以尝试将 .csv 档案拖进 VSCode 中,这样也可以打开来看的。

但是如果你觉得一推逗号很难看的话,也可以替 VSCode 安装 Excel Viewer 套件来观看 csv 档:

https://ithelp.ithome.com.tw/upload/images/20210920/20119486H63bG7UIK9.png

(这边也稍微让我置入性行销一下,如果你想知道更多套件的话,可以阅读这一篇 Visual Studio Code(VSCode) 必备实用套件。)

稍微扯远了,让我们回到 Python 中,接下来由於要读取 CSV 档案所以我们必须引入 CSV 模组,概念就跟使用 JSON 的时候一样。

但是在引入之前我们可以先尝试打开 .csv 档案:

f = open('example.csv', 'r')
read = f.read()
f.close()
print(read)

基本上我们可以知道是可以正常运作的,但是如果你想要取值的话就会无法正常取值:

print(read['name']) # TypeError: string indices must be integers

毕竟概念就跟 JSON 章节的状况是一样的。

哦!顺道提一下,在 Node.js 开发时也是需要引入 CSV 相关套件的,例如...csv-parse

var csvParse = require('csv-parse');
...

因此我们就会需要借助 CSV 模组的方法来帮我们正确的读取转换 .csv 资料,而读取的函式是 reader(),如果想要正确的取出资料的话,就必须使用 for in 回圈。

疑?为什麽要用 for in 呢?主要原因是 CSV 模组在处理时,它会将逗号结尾最後一个元素的作为一个阵列的终点,什麽意思呢?例如刚刚的范例:

name,title,url
ray,Welcome.Web.World,https://hsiangfeng.github.io/
ray,第-13-届-iT邦帮忙铁人赛,https://hsiangfeng.github.io/tags/第-13-届-iT邦帮忙铁人赛/

虽然我前面是这样讲,但是实际上你输出的话会看到一串诡异的东西:

<_csv.reader object at 0x1021b7660>

https://ithelp.ithome.com.tw/upload/images/20210920/20119486CYPAs48EMM.png

所以我觉得你可以把 CSV 处理後的 .csv 档案资料它想像成这样子:

[
  ['name', 'title', 'url'],
  ['ray', 'Welcome.Web.World', 'https://hsiangfeng.github.io/'],
  ['ray', '第-13-届-iT邦帮忙铁人赛', 'https://hsiangfeng.github.io/tags/第-13-届-iT邦帮忙铁人赛/']
]

因此我们就会需要使用 for in 将刚刚读取出来的 .csv 资料输出:

import csv
csvfile = open('example.csv', 'r')

rows = csv.reader(csvfile)
for row in rows:
  print(row)

https://ithelp.ithome.com.tw/upload/images/20210920/20119486jC4STHMIbt.png

是不是觉得超简单呢?

https://ithelp.ithome.com.tw/upload/images/20210920/20119486TpwCv80KLc.png

写入 CSV

那麽有读取的话,想当然就一定会有写入的行为,所以接下来就会来试着将资料写入到 .csv 中。

那麽 CSV 之所以好用还有一个原因是很接近一个阵列形式,前面我们有大概举例它的形式类似以下:

[
  ['name', 'title', 'url'],
  ['ray', 'Welcome.Web.World', 'https://hsiangfeng.github.io/'],
  ['ray', '第-13-届-iT邦帮忙铁人赛', 'https://hsiangfeng.github.io/tags/第-13-届-iT邦帮忙铁人赛/']
]

因此整体概念与串列非常类似,但是绝对不是叫你用 append() 去写入 .csv,这边你依然必须是使用 CSV 模组的方法去写入,因此起手式必须先建立写入的行为也就是 writer,你必须告知 CSV 模组预计要写入到哪个档案:

import csv
csvfile = open('example.csv', 'r')

csvWriter = csv.writer(csvfile)

准备好起手式之後,接下来只需要使用 writerow 方法就可以开始写入罗:

import csv
csvfile = open('example.csv', 'w')

csvWriter = csv.writer(csvfile)
csvWriter.writerow(['ray','粉丝专页','https://www.facebook.com/HsiangFengWeb'])

接下来你再去打开这个档案就可以看到刚刚的内容被成功写入了:

name,title,url
ray,Welcome.Web.World,https://hsiangfeng.github.io/
ray,第-13-届-iT邦帮忙铁人赛,https://hsiangfeng.github.io/tags/第-13-届-iT邦帮忙铁人赛/
ray,粉丝专页,https://www.facebook.com/HsiangFengWeb

如果你期望写入多笔资料的话,就会需要搭配回圈:

import csv
csvfile = open('example.csv', 'w')

csvWriter = csv.writer(csvfile)

data = [
  ['ray', 'Welcome.Web.World', 'https://hsiangfeng.github.io/'],
  ['ray', '第-13-届-iT邦帮忙铁人赛', 'https://hsiangfeng.github.io/tags/第-13-届-iT邦帮忙铁人赛/'],
  ['ray','粉丝专页','https://www.facebook.com/HsiangFengWeb']
]

for row in data:
  csvWriter.writerow(row)

这边请务必注意 open 的模式,如果你期望是开启档案後从档案结尾写入,记得要将模式改成 a 唷。

作者的话

今天尝试制作绍兴醉鸡後,发现味道与花雕真的有一点差异,整体来讲花雕比较香,但是绍兴酒味比较浓(我的错觉?),但是两者吃起来感觉差异不大,但是还不错吃就是了,讲到绍兴也让我想到高雄旗山有一个很有名的炒饭叫做绍兴炒饭,这间的炒饭真的吃一次後就会很难忘记,推荐有机会去旗山玩的人可以吃看看。

关於兔兔们

兔法无边


<<:  沟通技巧中的利害关系人管理

>>:  [DAY 6] 建立Spring boot

[Day14] 引入 crate

我原本预想是在 15 或 16 号开始进入专案实做,结果超进度了。 不过,差距不大,所以没什麽关系。...

Google Script+LINE 打造聊天机器人 #1-工具介绍

专案简介 起源:方便自己与亲友查询汇率和日期,以及定时提醒汇率以利购买外汇。 功能:查询(1)即时汇...

[Day16] Flutter - Firebase Authentication & Google Sign-In ( IOS & Android )

前言 Hi, 我是鱼板伯爵今天要教大家 Firebase Authentication 和开通 Go...

#12 Web Crawler 5

今天应该是爬虫的最後一篇了。我们要把爬下来的资料做成「每日铁人赛热门 Top 10」。 来看看爬下来...

Day-18 Excel手把手作图表(三)

今日练习档 ԅ( ¯་། ¯ԅ) 大家好,今天进到了图表主题的第四天,如果您还没看过前三天的可以先回...