文件读写 ( open )
本篇教学会介绍“文件读写”的内建函数 open,透过 Pythen 的 open 函数,就能针对电脑中的文件,进行新增、打开、编辑等动作,如果是使用 Google Colab,更可以和 Google 云端硬盘连动,编辑云端硬盘的文件。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
使用 open()
Python 内建的 open() 使用的语法如下所示,文件表示文件的路径和档名,模式则代表打开文件后,能对这个文件编辑的权限模式,默认为 r。
f = open('檔案', 模式)
open() 还有几个可以不需要填入的参数,不填入则会使用默认值:
| 参数 | 说明 |
|---|---|
| newline | 换行模式,默认 None ( 使用通用换行符号,等同 '' ),可以是 ''、'\n'、'\r' 或 '\r\n'。 |
| encoding | 解码或编码文件名称,默认 None。 |
| errors | 处理解码或编码时的错误,默认 None。 |
| buffering | 内存缓冲区大小,默认 -1。 |
| closefd | 判断文件名称或文件描述,默认 True。 |
| opener | 文件描述,默认 None。 |
文件路径
文件的路径使用“相对路径”,相对于“执行这个 Python 程序的位置”,例如 Python 的程序位在 file 文件夹下,要存取 file/demo 文件夹内的 test.txt 文件时,路径就是“demo/test.txt”。
f = open('demo/test.txt','r')
a = f.read()
print(a)
f.close()
如果是使用 Google Colab,默认执行的路径放在“/content/drive/MyDrive/”里。
f = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r')
a = f.read()
print(a)
f.close()
存取模式
使用 open() 打开文件时,可指定打开后文件的存取模式,默认是文字模式打开,后方如果有“+”号,表示在功能上不仅可以读取,也可以写入:
| 模式 | 说明 |
|---|---|
| r、rt | 读取文件 ( 默认值,文件必需存在 )。 |
| w、wt | 写入文件 ( 如果文件不存在,就建立新文件,如果文件存在,则清空内容并将其覆写 )。 |
| x、xt | 建立新的文件 ( 只针对不存在的文件,如果文件已经存在,则操作失败 )。 |
| a、at | 从文件的最末端添加内容 ( 如果文件不存在,就建立新文件 )。 |
| r+、rt+ | 读取并更新文件 ( 更新方式从最前端写入内容 )。 |
| w+、wt+ | 写入并读取文件 ( 会清空并覆写内容 )。 |
| a+、at+ | 从文件的最末端添加内容并读取文件。 |
如果后方加上 b,则会以二进制模式打开:
| 模式 | 说明 |
|---|---|
| rb | 以二进制模式读取文件。 |
| wb | 以二进制模式写入文件。 |
| xb | 以二进制模式建立一个新的文件。 |
| ab | 以二进制模式从文件的最末端添加内容。 |
| rb+ | 以二进制模式读取并更新文件。 |
| wb+ | 以二进制模式写入并读取文件。 |
| ab+ | 以二进制模式从文件的最末端添加内容并读取文件。 |
举例来说,如果打开文件时模式设定为 w,就无法使用读取的方法读取文件内容。
f = open('/content/drive/MyDrive/Colab Notebooks/test.txt','w') # 使用 w 模式
a = f.read() # 發生錯誤 not readable
print(a)
如果打开文件时设定 r+,则可以读取内容也可以从开头的地方加入内容 ( 使用 r 或 r+ 时,文件必需存在,不然会发生错误 )。
f = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r+')
a = f.read()
f.write('hello')
print(a)
f.close()
操作方法
打开文件后,可以透过下列常用的方法操作文件:
| 方法 | 说明 |
|---|---|
| read(size) | 读取文件内容,默认不设定 size,不设定 size 会读取整个文件,如果设定 size 则会读取指定的字元数量。 |
| readline(size) | 读取文件的第一行内容,默认不设定 size,没有设定 size 就会读取一整行,如果设定 size 则会读取指定的字元数量。 |
| readlines(size) | 读取文件内容并以串列方式回传,默认不设定 size,如果没有设定 size 会读取全部内容,如果设定 size 则会回传包含 size 大小的那几行。 |
| readable() | 文件是否可读取,回传 True 或 False。 |
| write(文字内容) | 写入内容。 |
| writelines(文字内容串列) | 以串列方式写入内容,如果需要换行必须自行加入换行符号 \n。 |
| writable() | 文件是否可写入,回传 True 或 False。 |
| tell() | 回传目前读取文件指针的位置 ( 文件从头算起的字元数)。 |
| seek(偏移量, 起始位置) | 移动文件指针 ( 起始位置默认 0 表示文件开头,1 为当前位置,2 为文件结尾 )。 |
| close() | 关闭文件,并释出内存。 |
read(size)
范例的程序码使用两种方式读取内容为 hello world 的 txt 文件 ( 如果只设定一个 f1,使用 read() 之后就会读取整份文件,read(2) 就会失效,所以使用 f1 和 f2 ),如果没有设定 size,则完整读取整份文件,如果有设定 size,则读取到 size 的字元数,读取的文件如果超过电脑的内存大小,则会发生问题 ( 读取 1GB 的文件就会消耗 1GB 的内存 )
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') f2 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') a = f1.read() b = f2.read(2) print(a) # hello world print(b) # he ( 只讀取前兩個字元 ) f1.close() f2.close()readline(size)
范例的程序码使用两种方式读取内容为第一行 hello world 的 txt 文件,如果没有设定 size,则完整读取第一行,如果有设定 size 则读取第一行的 size 字元数,若 size 超过第一行的数量,就会完整读取第一行 ( 就算文件有很多行,还是只会读取第一行 )。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') f2 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') a = f1.readline() b = f2.readline(2) print(a) # hello world print(b) # he ( 只讀取單一行的前兩個字元 ) f1.close() f2.close()readlines(size)
范例的程序码使用两种方式读取内容为三行 hello world、good morning 和 12345 的 txt 文件,如果没有设定 size 则读取全部的文件内容,以行为单位回传为串列,如果有设定 size,则会以 size 抵达的字元位置行数为最大行数,回传为串列。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') f2 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') a = f1.readlines() # 讀取全部的行,變成串列形式 b = f2.readlines(20) # 讀取包含 20 個字元的行,變成串列形式 print(a) # ['hello world\n', 'good morning\n', '12345'] print(b) # ['hello world\n', 'good morning\n'] f1.close() f2.close()readable()
范例的程序码执行后,会显示这个文件是否能读取,或是否能写入,回传 True 或 False。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','w') f2 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') print(f1.readable()) # Fasle 因為設定 w print(f2.readable()) # True 因為設定 r f1.close() f2.close()f.write(文字内容)
范例的程序码执行后,会清空原本 test.txt 的内容,写入新的内容。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','w') f1.write('good morning') # 寫入 good morning f1.close()f.writelines(文字内容串列)
范例的程序码执行后,会清空原本 test.txt 的内容,并以串列方式写入内容,如果需要换行必须自行加入换行符号 \n。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','w') f1.writelines(['123\n','456\n','789\n']) # 寫入三行內容 f1.close()writeable()
范例的程序码执行后,会显示这个文件是否能读取,或是否能写入,回传 True 或 False。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','w') f2 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') print(f1.writeable()) # True 因為設定 w print(f2.writeable()) # False 因為設定 r f1.close() f2.close()tell()
范例的程序码执行后,会回传目前读取文件指针的位置 ( 文件从头算起的字元数 )。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') a = f1.read(5) # 讀取前五個字元,讀去完畢後指針位在 5 t = f1.tell() # 讀取指針位置 print(a) # hello print(t) # 5 f1.close()seek(偏移量, 起始位置)
范例的程序码执行后,会将指针从开头位置移动 5 个字元,然后再读取 5 个字元 ( 起始位置默认 0 表示文件开头,1 为当前位置,2 为文件结尾 )。
f1 = open('/content/drive/MyDrive/Colab Notebooks/test.txt','r') # 內容為 123456789 f1.seek(2,0) # 將指針移動到 2 和 3 中間 a = f1.read(5) # 讀取後方五個字元 print(a) # 34567 f1.close()close()
关闭文件,并释出内存。
使用 with
使用 with 可以让打开文件,执行相关内容后自动关闭并释出内存,使用的语法如下:
with open('demo/test.txt','w') as f1:
f1.write('good morning') # 寫入 good morning
# 完成後如果沒有後續動作,就會自動關閉檔案
微信扫码关注
抖音扫码关注