目標(biāo)
- 文件的概念
- 文件的基本操作
- 文件/文件夾的常用操作
- 文本文件的編碼方式
01. 文件的概念
1.1 文件的概念和作用
- 計(jì)算機(jī)的 文件拷姿,就是存儲(chǔ)在某種 長(zhǎng)期儲(chǔ)存設(shè)備 上的一段 數(shù)據(jù)
- 長(zhǎng)期存儲(chǔ)設(shè)備包括:硬盤驮肉、U 盤暇赤、移動(dòng)硬盤、光盤...
文件的作用
將數(shù)據(jù)長(zhǎng)期保存下來(lái)重抖,在需要的時(shí)候使用
1.2 文件的存儲(chǔ)方式
- 在計(jì)算機(jī)中棒妨,文件是以 二進(jìn)制 的方式保存在磁盤上的
文本文件和二進(jìn)制文件
-
文本文件
- 可以使用 文本編輯軟件 查看
- 本質(zhì)上還是二進(jìn)制文件
- 例如:python 的源程序
-
二進(jìn)制文件
- 保存的內(nèi)容 不是給人直接閱讀的踪古,而是 提供給其他軟件使用的
- 例如:圖片文件、音頻文件券腔、視頻文件等等
- 二進(jìn)制文件不能使用 文本編輯軟件 查看
02. 文件的基本操作
2.1 操作文件的套路
在 計(jì)算機(jī) 中要操作文件的套路非常固定伏穆,一共包含三個(gè)步驟:
- 打開(kāi)文件
- 讀、寫文件
- 讀 將文件內(nèi)容讀入內(nèi)存
- 寫 將內(nèi)存內(nèi)容寫入文件
- 關(guān)閉文件
2.2 操作文件的函數(shù)/方法
- 在
Python
中要操作文件需要記住 1 個(gè)函數(shù)和 3 個(gè)方法
序號(hào) | 函數(shù)/方法 | 說(shuō)明 |
---|---|---|
01 | open | 打開(kāi)文件纷纫,并且返回文件操作對(duì)象 |
02 | read | 將文件內(nèi)容讀取到內(nèi)存 |
03 | write | 將指定內(nèi)容寫入文件 |
04 | close | 關(guān)閉文件 |
-
open
函數(shù)負(fù)責(zé)打開(kāi)文件枕扫,并且返回文件對(duì)象 -
read
/write
/close
三個(gè)方法都需要通過(guò) 文件對(duì)象 來(lái)調(diào)用
2.3 read 方法 —— 讀取文件
-
open
函數(shù)的第一個(gè)參數(shù)是要打開(kāi)的文件名(文件名區(qū)分大小寫)- 如果文件 存在,返回 文件操作對(duì)象
- 如果文件 不存在辱魁,會(huì) 拋出異常
-
read
方法可以一次性 讀入 并 返回 文件的 所有內(nèi)容 -
close
方法負(fù)責(zé) 關(guān)閉文件- 如果 忘記關(guān)閉文件烟瞧,會(huì)造成系統(tǒng)資源消耗诗鸭,而且會(huì)影響到后續(xù)對(duì)文件的訪問(wèn)
-
注意:
read
方法執(zhí)行后,會(huì)把 文件指針 移動(dòng)到 文件的末尾
# 1\. 打開(kāi) - 文件名需要注意大小寫
file = open("README")
# 2\. 讀取
text = file.read()
print(text)
# 3\. 關(guān)閉
file.close()
提示
- 在開(kāi)發(fā)中参滴,通常會(huì)先編寫 打開(kāi) 和 關(guān)閉 的代碼强岸,再編寫中間針對(duì)文件的 讀/寫 操作!
文件指針(知道)
- 文件指針 標(biāo)記 從哪個(gè)位置開(kāi)始讀取數(shù)據(jù)
- 第一次打開(kāi) 文件時(shí)砾赔,通常 文件指針會(huì)指向文件的開(kāi)始位置
- 當(dāng)執(zhí)行了
read
方法后蝌箍,文件指針 會(huì)移動(dòng)到 讀取內(nèi)容的末尾- 默認(rèn)情況下會(huì)移動(dòng)到 文件末尾
思考
- 如果執(zhí)行了一次
read
方法,讀取了所有內(nèi)容暴心,那么再次調(diào)用read
方法十绑,還能夠獲得到內(nèi)容嗎?
答案
- 不能
- 第一次讀取之后酷勺,文件指針移動(dòng)到了文件末尾本橙,再次調(diào)用不會(huì)讀取到任何的內(nèi)容
2.4 打開(kāi)文件的方式
-
open
函數(shù)默認(rèn)以 只讀方式 打開(kāi)文件,并且返回文件對(duì)象
語(yǔ)法如下:
f = open("文件名", "訪問(wèn)方式")
訪問(wèn)方式 | 說(shuō)明 |
---|---|
r | 以只讀方式打開(kāi)文件脆诉。文件的指針將會(huì)放在文件的開(kāi)頭甚亭,這是默認(rèn)模式。如果文件不存在击胜,拋出異常 |
w | 以只寫方式打開(kāi)文件亏狰。如果文件存在會(huì)被覆蓋。如果文件不存在偶摔,創(chuàng)建新文件 |
a | 以追加方式打開(kāi)文件暇唾。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾辰斋。如果文件不存在策州,創(chuàng)建新文件進(jìn)行寫入 |
r+ | 以讀寫方式打開(kāi)文件。文件的指針將會(huì)放在文件的開(kāi)頭宫仗。如果文件不存在够挂,拋出異常 |
w+ | 以讀寫方式打開(kāi)文件。如果文件存在會(huì)被覆蓋藕夫。如果文件不存在孽糖,創(chuàng)建新文件 |
a+ | 以讀寫方式打開(kāi)文件。如果該文件已存在毅贮,文件指針將會(huì)放在文件的結(jié)尾办悟。如果文件不存在,創(chuàng)建新文件進(jìn)行寫入 |
提示
- 頻繁的移動(dòng)文件指針滩褥,會(huì)影響文件的讀寫效率病蛉,開(kāi)發(fā)中更多的時(shí)候會(huì)以 只讀、只寫 的方式來(lái)操作文件
寫入文件示例
# 打開(kāi)文件
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天氣真好")
# 關(guān)閉文件
f.close()
2.5 按行讀取文件內(nèi)容
-
read
方法默認(rèn)會(huì)把文件的 所有內(nèi)容 一次性讀取到內(nèi)存 - 如果文件太大铡恕,對(duì)內(nèi)存的占用會(huì)非常嚴(yán)重
readline
方法
-
readline
方法可以一次讀取一行內(nèi)容 - 方法執(zhí)行后,會(huì)把 文件指針 移動(dòng)到下一行丢间,準(zhǔn)備再次讀取
讀取大文件的正確姿勢(shì)
# 打開(kāi)文件
file = open("README")
while True:
# 讀取一行內(nèi)容
text = file.readline()
# 判斷是否讀到內(nèi)容
if not text:
break
# 每讀取一行的末尾已經(jīng)有了一個(gè) `\n`
print(text, end="")
# 關(guān)閉文件
file.close()
2.6 文件讀寫案例 —— 復(fù)制文件
目標(biāo)
用代碼的方式探熔,來(lái)實(shí)現(xiàn)文件復(fù)制過(guò)程
image
小文件復(fù)制
- 打開(kāi)一個(gè)已有文件,讀取完整內(nèi)容烘挫,并寫入到另外一個(gè)文件
# 1\. 打開(kāi)文件
file_read = open("README")
file_write = open("README[復(fù)件]", "w")
# 2\. 讀取并寫入文件
text = file_read.read()
file_write.write(text)
# 3\. 關(guān)閉文件
file_read.close()
file_write.close()
大文件復(fù)制
- 打開(kāi)一個(gè)已有文件诀艰,逐行讀取內(nèi)容,并順序?qū)懭氲搅硗庖粋€(gè)文件
# 1\. 打開(kāi)文件
file_read = open("README")
file_write = open("README[復(fù)件]", "w")
# 2\. 讀取并寫入文件
while True:
# 每次讀取一行
text = file_read.readline()
# 判斷是否讀取到內(nèi)容
if not text:
break
file_write.write(text)
# 3\. 關(guān)閉文件
file_read.close()
file_write.close()
03. 文件/目錄的常用管理操作
- 在 終端 / 文件瀏覽器饮六、 中可以執(zhí)行常規(guī)的 文件 / 目錄 管理操作其垄,例如:
- 創(chuàng)建、重命名卤橄、刪除绿满、改變路徑、查看目錄內(nèi)容窟扑、……
- 在
Python
中喇颁,如果希望通過(guò)程序?qū)崿F(xiàn)上述功能,需要導(dǎo)入os
模塊
文件操作
序號(hào) | 方法名 | 說(shuō)明 | 示例 |
---|---|---|---|
01 | rename | 重命名文件 | os.rename(源文件名, 目標(biāo)文件名) |
02 | remove | 刪除文件 | os.remove(文件名) |
目錄操作
序號(hào) | 方法名 | 說(shuō)明 | 示例 |
---|---|---|---|
01 | listdir | 目錄列表 | os.listdir(目錄名) |
02 | mkdir | 創(chuàng)建目錄 | os.mkdir(目錄名) |
03 | rmdir | 刪除目錄 | os.rmdir(目錄名) |
04 | getcwd | 獲取當(dāng)前目錄 | os.getcwd() |
05 | chdir | 修改工作目錄 | os.chdir(目標(biāo)目錄) |
06 | path.isdir | 判斷是否是文件 | os.path.isdir(文件路徑) |
提示:文件或者目錄操作都支持 相對(duì)路徑 和 絕對(duì)路徑
04. 文本文件的編碼格式(科普)
- 文本文件存儲(chǔ)的內(nèi)容是基于 字符編碼 的文件嚎货,常見(jiàn)的編碼有
ASCII
編碼橘霎,UNICODE
編碼等
Python 2.x 默認(rèn)使用
ASCII
編碼格式
Python 3.x 默認(rèn)使用UTF-8
編碼格式
4.1 ASCII 編碼和 UNICODE 編碼
ASCII
編碼
- 計(jì)算機(jī)中只有
256
個(gè)ASCII
字符 - 一個(gè)
ASCII
在內(nèi)存中占用 1 個(gè)字節(jié) 的空間-
8
個(gè)0/1
的排列組合方式一共有256
種,也就是2 ** 8
-
image
UTF-8
編碼格式
- 計(jì)算機(jī)中使用 1~6 個(gè)字節(jié) 來(lái)表示一個(gè)
UTF-8
字符殖属,涵蓋了 地球上幾乎所有地區(qū)的文字 - 大多數(shù)漢字會(huì)使用 3 個(gè)字節(jié) 表示
-
UTF-8
是UNICODE
編碼的一種編碼格式
4.2 Ptyhon 2.x 中如何使用中文
Python 2.x 默認(rèn)使用
ASCII
編碼格式
Python 3.x 默認(rèn)使用UTF-8
編碼格式
- 在 Python 2.x 文件的 第一行 增加以下代碼姐叁,解釋器會(huì)以
utf-8
編碼來(lái)處理 python 文件
# *-* coding:utf8 *-*
這方式是官方推薦使用的!
- 也可以使用
# coding=utf8
unicode 字符串
- 在
Python 2.x
中洗显,即使指定了文件使用UTF-8
的編碼格式外潜,但是在遍歷字符串時(shí),仍然會(huì) 以字節(jié)為單位遍歷 字符串 - 要能夠 正確的遍歷字符串挠唆,在定義字符串時(shí)橡卤,需要 在字符串的引號(hào)前,增加一個(gè)小寫字母
u
损搬,告訴解釋器這是一個(gè)unicode
字符串(使用UTF-8
編碼格式的字符串)
# *-* coding:utf8 *-*
# 在字符串前碧库,增加一個(gè) `u` 表示這個(gè)字符串是一個(gè) utf8 字符串
hello_str = u"你好世界"
print(hello_str)
for c in hello_str:
print(c)