从 JavaScript 角度学 Python(18) - 档案处理

前言

接下来将会聊聊如何使用 Python 做到一些档案处理的部分,例如:新增档案、写入资料到特定档案内等方式。

档案处理(File Handling)

Python 本身有支援档案处理相关的函式,而档案处理可以做到哪些事情呢?举例一个情境好了。

假设今天我们写了一只爬虫,然後去爬了特定网站(可能是 IT 邦帮忙),爬完之後你需要将资料储存下来,那麽你就会需要使用到建立档案与写入档案等等的行为。

所以档案处理的相关知识就变得不能不了解罗~

https://ithelp.ithome.com.tw/upload/images/20210918/20119486D0wBAS7C7E.png

那你可能会问说 JavaScript 可不可以做到类似档案处理的部分呢?正常来讲是不行的,除非...你使用的是 Node.js。

如果是使用 Node.js 的话,通常会使用 fs (File System) 模组来达到读取与写入等档案操作的行为,例如:

var fs = require('fs');

fs.open('filename.txt', 'r+', function() {
  console.log('档案已开启。')
})

而这边并不着墨於 Node.js 的档案存取部分,所以接下来会直接快速介绍 Python 的档案模组部分,以便我们後面的学习唷~

open

这边记得一件事情,只要跟 Python 档案相关的操作,起手式是绝对闪不掉用 open() 函式,而 open() 很顾名思义就只是打开什麽东西的意思,所以这边要注意 open() 只是要打开某个档案的行为而已唷。

开始/读取档案

打开档案之前要先注意到 open() 函式是一个表达式,所以会需要一个变数储存,最主要原因是我们当我们打开了一个档案之後,如果你不储存的话,那你接下来要怎麽操作?

https://ithelp.ithome.com.tw/upload/images/20210918/20119486evP9NvjQNe.png

所以这边要切记,当你呼叫了 open() 函式之後要记得用一个变数储存,那麽 open() 主要是带入两个参数:

f = open('filename', 'mode')
  • filename
    • 档案名称 + 副档名
  • mode
    • 档案的模式

档案名称的部分只需要注意要加上副档名,其他比较需要注意的是 mode 的部分,依据你传入的参数不同就会得到不同结果,所以这边就简单列一下基本的 mode 参数:

参数 说明
r 以唯读的方式开启档案
w 清除档案内容後再写入
a 开启档案後从档案结尾写入

这边比较需要注意的是 open() 的意思就是「开启档案」,然後是用什麽方式处理。

那麽我们可以先尝试撰写以下程序码并尝试执行:

f = open('filename.txt', 'r')

基本上你有很高机会遇到以下错误讯息:

https://ithelp.ithome.com.tw/upload/images/20210918/20119486Q4okUmqfsy.png

FileNotFoundError: [Errno 2] No such file or directory: 'filename.txt'

因为这个档案不存在所以才会发生该问题,这时候你可以自己建立一个 filename.txt 档案,然後内容填写以下:

Hello Python

https://ithelp.ithome.com.tw/upload/images/20210918/20119486jbG8z5nIYC.png

当你再次执行 Python 时,就不会出现任何错误,但是你可能会想说怎麽没有输出内容呢?就如同前面所讲的,目前只是打开这个档案,并没有读取,所以如果想要呈现内容的话就必须使用 read() 函式来读取:

f = open('filename.txt', 'r')
read = f.read()
print(read)

这样子就可以读取出内容罗~

https://ithelp.ithome.com.tw/upload/images/20210918/20119486LEJZJ3jzmM.png

484 超直觉呢?

https://ithelp.ithome.com.tw/upload/images/20210918/20119486oXGzK57gIN.png

这时候你可能会想说,你希望 filename.txt 这个档案是自动生成的,而不是我们手动生成,这时候你是可以尝试换另一种模式:

f = open('filename.txt', 'w')

或者是

f = open('filename.txt', 'a')

这两种模式都可以达到「当档案不存在时,就自动建立档案」。

那麽这两种模式有何差异呢?

w 模式下,如果档案不存在就会新增档案这一点没问题,但是如果这个档案存在的话,就会先清除档案内容,这一点要特别注意一下。

a 模式则是会在开启之後,从尾行开始写入,这什麽意思呢?让我们往後面练习会更清楚。

写入档案

那麽前面尝试了开启档案并读取档案内容的行为,接下来就是关於写入档案的部分,否则你只打开跟读取不写入很怪吧?

https://ithelp.ithome.com.tw/upload/images/20210918/20119486QbVoTioVHA.png

不管怎麽样,前面我们有讲过只要跟档案操作相关的行为就必定会有一个 open() 函式,所以前面就会有一个 open() 函式的起手式,前面也有讲到依据你开启档案所传入的参数模式的不同,而写入方式就会跟着不同,那麽这是什麽意思呢?首先我们先看一下刚刚前面的范例程序码:

f = open('filename.txt', 'r')
read = f.read()
print(read)

这一段程序码执行之後结果就如同刚刚的图片所示:

https://ithelp.ithome.com.tw/upload/images/20210918/20119486YMH7ZTbxFv.png

那麽我们期望打开档案後写入文字该怎麽做呢?

首先我们先假设我们想写入两段文字,分别是:「我是 Ray」、「部落格网址是 https://hsiangfeng.github.io/」这两段文字,这时候就会使用到 write 的函式,但是在使用 write 之前有几点注意事项要注意:

  • 写入档案时,必须为 a 或是 w 模式
  • 写入档案模式时,是不可以读取内容的

如果你用 r 模式去开启并尝试写入的话就会出现这一段错误讯息:

io.UnsupportedOperation: not writable

反之,如果你是在读取模式尝试写入则会得到另一个错误讯息:

io.UnsupportedOperation: not readable

所以这边就先尝试使用 a 模式撰写。

a 模式的特色就是开启档案後当你有写入行为时,就会以档案内容结尾处开始写入,举例来讲,我目前 filename.txt 的内容如下:

Hello Python

那麽当我执行以下程序码後:

f = open('filename.txt', 'a')
f.write('我是 Ray')
f.write('部落格网址是 https://hsiangfeng.github.io/')
f.close()

你再去打开 filename.txt 会得到以下结果:

https://ithelp.ithome.com.tw/upload/images/20210918/20119486VqYDtkAf65.png

如果你期望的是断行的话,只需要在程序码尾端补上换行符号 \n 即可:

f = open('filename.txt', 'a')
f.write('我是 Ray\n')
f.write('部落格网址是 https://hsiangfeng.github.io/')
f.close()

https://ithelp.ithome.com.tw/upload/images/20210918/20119486u1jOjyj7EJ.png

回头讲讲 w 模式,w 模式简单来讲就是会先清除档案内容才开始写入。

举例来讲,目前的 filename.txt 内容如下:

Hello Python
我是 Ray
部落格网址是 https://hsiangfeng.github.io/

当我执行以下程序码後,就会变了:

f = open('filename.txt', 'w')
f.write('我是 Ray\n')
f.write('部落格网址是 https://hsiangfeng.github.io/')
f.close()

https://ithelp.ithome.com.tw/upload/images/20210918/201194866ClmBH1sQQ.png

以我自己来讲,我是比较常使用 a 模式就是了,毕竟 w 模式会先将内容清空後再写入,如果没有把这两种模式搞清楚的话,你可能会发生为什麽档案一直被清空的状况。

https://ithelp.ithome.com.tw/upload/images/20210918/20119486K0328plmBR.png

追加模式

最後我想补充一个东西,叫做追加模式,上面我们聊了许多档案处理相关的方式,其中也包含了写法与运作说明,那麽其实 open 函式的开启 mode 还有其他模式可以使用,而这些模式称之为「追加模式」。

使用的方式非常的简单,只需要加上一个 + 号就可以改变原有的模式。

举例来讲,前面我们有讲到 r 代表的是唯读开启,因此无法写入,但是当你使用了追加模式 r+,那麽此时就会变成读写皆可的状态,意指同时可以写入与读取档案。

什麽意思呢?这边简单举例一个范例:

f = open('filename.txt', 'r+')
f.write('我是 Ray\n')
f.write('部落格网址是 https://hsiangfeng.github.io/')
f.close()

这一段程序码是可以正常执行并不会出现 io.UnsupportedOperation: not writable 的。

而其他的 wa 模式也可以使用 + 号追加模式,但实际上我测试下来 w+a+ 并没有太大差异,毕竟一个依然是清除档案内容在写入与在档案结尾写入,实际上比较有差异的就是 r 模式,所以就不再额外补充罗。

那追加模式的使用时机并没有绝对,还是要看需求为主哩。

https://ithelp.ithome.com.tw/upload/images/20210918/20119486lDQsqr3ljL.png

作者的话

今天狗狗状况整个大翻转,一觉醒来开始会耍白目,虽然有点烦,但是这样子才是牠应该要有的样子。

关於兔兔们

兔法无边


<<:  Deserialization

>>:  Day4 Let's ODOO: Model(1) Class & Attribute

Day20 浅谈AJAX?

大家好我是乌木白,今天要和大家介绍的是 AJAX,AJAX 是我在学习 JavaScript 这门...

Webview问题集(下)-常用功能

缘由: APP开发使用Webview也是很常见的,有些功能常用但难度不高,有些功能则需要与网页端配合...

笔记:好用HTML5 的表单input元件及属性

html的form标签之input小记录 前言本篇是上课中所提及好用,但是笔者小新手之前未发现的上课...

JS Getter 与 Setter DAY71

Setter 与 Setter Getter: 取得特定值的方法 Setter: 存值的方法 Get...

[21] [Discord 机器人] 01.建立基本机器人

新增 Discord Application 到 Discord Developers Applic...