前一章节简单的聊了一下 JSON 之後,接下来我想额外补充一个关於 CSV 档案处理的部分,而 CSV 通常在批次汇入的时候会很常看到,所以就特别拉一篇来聊聊。
通常看到 CSV 档案的时候,大多人会觉得它是一个 Excel 或是 Google 试算表也不爲过,毕竟通常我们开启 CSV 就是使用这几种软件去打开,我以前还以为 CSV 就是 Excel,还傻傻的问说 CSV 档该怎麽打开。
应该是我太笨了吧?对吧?还是你也跟我一样一开始以为 CSV 只是单纯的 Excel 格式的一种呢?下面留言给我吧,让我知道我不孤单。
好,那麽什麽是 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,在去打开,你会发现是可以正常运作的,是不是超简单的~
因此如果你有使用一些批量汇入的服务,你也可以发现大多都是支援 .csv 与 .txt 哩~
那麽为什麽要特别讲到 CSV 呢?就如同前面所言,许多系统都会支援 .csv 批次汇入,甚至你也可以看到一些爬虫爬完资料之後就转换成 CSV 格式,然後再上传到自己的分析系统,所以好 CSV 不了解一下怎麽在 Python 中如何使用吗?
那麽首先我们先学如何读取 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 了吗?
简单来讲,你先建立一个 .txt 的文字档案,然後填入我上面给的内容,再将副档名改成 .csv 就可以罗。
那麽当你建立好後使用 Excel 或是 Google 试算表打开会像这样子呈现:
题外话一下你可以尝试将 .csv 档案拖进 VSCode 中,这样也可以打开来看的。
但是如果你觉得一推逗号很难看的话,也可以替 VSCode 安装 Excel Viewer 套件来观看 csv 档:
(这边也稍微让我置入性行销一下,如果你想知道更多套件的话,可以阅读这一篇 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>
所以我觉得你可以把 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)
是不是觉得超简单呢?
那麽有读取的话,想当然就一定会有写入的行为,所以接下来就会来试着将资料写入到 .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
唷。
今天尝试制作绍兴醉鸡後,发现味道与花雕真的有一点差异,整体来讲花雕比较香,但是绍兴酒味比较浓(我的错觉?),但是两者吃起来感觉差异不大,但是还不错吃就是了,讲到绍兴也让我想到高雄旗山有一个很有名的炒饭叫做绍兴炒饭,这间的炒饭真的吃一次後就会很难忘记,推荐有机会去旗山玩的人可以吃看看。
我原本预想是在 15 或 16 号开始进入专案实做,结果超进度了。 不过,差距不大,所以没什麽关系。...
专案简介 起源:方便自己与亲友查询汇率和日期,以及定时提醒汇率以利购买外汇。 功能:查询(1)即时汇...
前言 Hi, 我是鱼板伯爵今天要教大家 Firebase Authentication 和开通 Go...
今天应该是爬虫的最後一篇了。我们要把爬下来的资料做成「每日铁人赛热门 Top 10」。 来看看爬下来...
今日练习档 ԅ( ¯་། ¯ԅ) 大家好,今天进到了图表主题的第四天,如果您还没看过前三天的可以先回...