- 第 101 篇 -
Date: 2025 - 05 - 26
Author: 鄭龍浩/仟墨
Python - 文件部分
學習時間: 2025-05-19
文章目錄
- Python - 文件部分
- 一 文件與路徑
- 1 文本文件
- 2 二進制文件
- 3 編碼格式
- ① 常見編碼格式
- ② 指定編碼格式
- ③ 最佳格式
- ④ 處理編碼錯誤
- 4 絕對路徑
- 5 相對路徑
- 基本寫法
- 返回上級目錄
- 組合路徑
- 二 操作文件的函數和方法
- 三 操作文件基本套路
- 四 文件指針
- 1 文件指針的基本介紹
- 2 注意:第二次調用 read 方法的時候讀取不到內容
- 3 `seek(offset, whence)`和 `tell()`
- 五 打開文件的方式
- 1 基本語法
- 2 訪問方式
- 六 讀取文件內容
- (1)一次性讀取文件內容
- (2)`readline`按行讀取文件內容
- 1 前言
- 2 `readline` 方法
- (3)使用`for lline int file`遍歷文件內容
- (4)`read(n)` 與 `readline(n)` 可以寫參數,`n`表示讀取多少個字符
- `file.read(5)`只打印前5個字符
- 七 文件復制
- 1 小文件復制
- (1 )步驟
- (2 )具體實現
- 2 大文件復制
- (1)步驟
- (2)具體實現
- 八 文件/目錄的常用管理操作
- 1 基本介紹
- 2 文件操作
- 3 目錄操作
- 九 自動關閉文件的方法
- 1 打開一個文件
- 2 同時打開多個文件
- 十 文件刷新
一 文件與路徑
1 文本文件
- 可以使用 文本編輯軟件 查看的文件
- 本質上還是二進制文件
- C 的源文件,Python 的源文件 也是文本文件
\r
表示回車\n
表示換行
2 二進制文件
-
保存的內容不可直接給人閱讀,而是使用提供的 其他專門的 軟件 內容才能讓人看懂
比如要看圖片,要用專門的軟件打開 圖片閱讀文件,音頻和視頻同理
-
Eg: 圖片文件、音頻文件、視頻文件…
-
二進制文件不能直接使用 文本文件軟件 進行查看,比如不能使用 記事本 直接打開圖片或者視頻,否則會亂碼
3 編碼格式
① 常見編碼格式
- ASCII: 最早的編碼,只能表示英文字符和一些特殊符號
- UTF-8: 最常用的Unicode編碼,可以表示幾乎所有語言的字符
- GBK: 中文編碼,主要用于簡體中文
- ISO-8859-1: 西歐語言編碼
② 指定編碼格式
在Python中打開文件時,可以通過encoding
參數指定編碼格式:
# 以UTF-8編碼打開文件
file = open("example.txt", "r", encoding="utf-8")# 以GBK編碼打開文件
file = open("example.txt", "r", encoding="gbk")
③ 最佳格式
-
推薦使用UTF-8編碼,它是跨平臺、跨語言的最佳選擇
-
在Python文件開頭添加編碼聲明:
# -*- coding: utf-8 -*-
④ 處理編碼錯誤
# 忽略無法解碼的字符
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:content = f.read()# 替換無法解碼的字符
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:content = f.read()
4 絕對路徑
路徑分為絕對路徑、相對路徑
-
絕對路徑:從文件系統的根目錄開始的完整路徑
C:\Users\Name\Documents\file.txt 在Python讀取的時候斜杠要反著來 C:/Users/Name/Documents/file.txt
5 相對路徑
基本寫法
file.txt
- 當前目錄下的文件data/file.txt
- 當前目錄的data子目錄中的文件./config.ini
- 顯式表示當前目錄下的文件(等同于config.ini
)
返回上級目錄
../
- 返回上一級目錄../settings.ini
- 上級目錄中的文件../../file.txt
- 上兩級目錄中的文件
組合路徑
../logs/app.log
- 上級目錄的logs子目錄中的文件./../shared/data.txt
- 先當前目錄,再上級,然后進入shared目錄
二 操作文件的函數和方法
Python 中操作文件需要記住1個函數和3個方法
函數方法 | 名 | 說明 |
---|---|---|
函數 | open | 打開文件,并且返回文件操作對象 |
方法 | read | 將文件內容讀取到內存 |
方法 | write | 將指定內容寫入文件 |
方法 | close | 關閉文件 |
方法 | find | 查找內容,返回索引 |
三 操作文件基本套路
-
打開文件
open
函數的第一個參數是要打開的文件名(文件名區分大小寫)- 如果文件存在,返回文件操作對象
- 如果文件不存在,會拋出異常
-
讀、寫文件
-
讀:將文件內容讀入內存
read
方法可以一次性讀入并返回文件的所有內容 -
寫:將內存內存寫入文件
write
-
-
關閉文件
close
方法負責關閉文件- 如果忘記關閉文件,會造成系統資源耗盡,而且會影響到后續對文件的訪問
- 方法執行后,會把文件指針移動到文件的末尾
三個步驟
# 1 打開文件
file = open("文件路徑", '打開方式', encoding='文件編碼')
# 2 讀取
text = file.read()
# 3 關閉
file.close() # 千萬不要忘記關閉文件
四 文件指針
1 文件指針的基本介紹
-
文件指針標記從哪個位置開始讀取數據
-
第一次打開文件的時候,通常文件指針會之指向文件的開始位置
-
當執行了
read
方法后,文件指針會移動到讀取內容的末尾默認情況下會移動到 文件末尾
2 注意:第二次調用 read 方法的時候讀取不到內容
- 如果執行了一次
read
方法,讀取了所有的內容,那么再次調用read
方法的時候,不可以獲取到內容!!!! - 因為 第一次讀取之后,文件指針移動到了文件的末尾,再次調用的時候是從文件的末尾開始讀取的,所以不會讀取到任何的內容
3 seek(offset, whence)
和 tell()
seek(offset, whence)
:移動文件指針whence=0
:從文件開頭計算(默認)whence=1
:從當前位置計算whence=2
:從文件末尾計算
tell()
:返回當前文件指針位置
with open('file.txt', 'r') as f:print(f.tell()) # 輸出:0f.seek(5) # 移動到第5個字節print(f.tell()) # 輸出:5
五 打開文件的方式
1 基本語法
open 函數默認以 只讀方式 打開文件,并且返回文件對象
file = open("文件路徑", "訪問方式", "文件編碼")
2 訪問方式
- 如果只需要讀的話,第二個參數可以不用寫
訪問方式 | 說明 |
---|---|
r | 以 只讀 的方式打開文件。如果文件存在,文件指針將會放在文件的開頭,這是默認模式。如果文件不存在,會拋出異常 |
w | 以 只寫 的方式打開文件。如果文件存在,如果寫入,文件內容會被覆蓋。如果文件不存在,創建新的文件 |
a | 以 追加 的方式打開文件。如果文件存在,文件指針將會放在文件的結尾。如果文件不存在,創建新的文件進行寫入 |
r+ | 以 讀寫 的方式打開文件。如果文件存在,文件指針將會放在文件的開頭。如果文件不存在,會拋出異常 |
w+ | 以 讀寫 的方式打開文件。如果文件存在,如果寫入,文件內容會被覆蓋。如果文件不存在,創建新的文件進行寫入 |
a+ | 以 讀寫 的方式打開文件。如果文件存在,文件指針將會放在文件的結尾。如果文件不存在,創建新的文件進行寫入 |
頻繁的移動文件指針,會影響文件的讀寫效率,開發中更多的時候會以 只讀、只寫 的方式來操作文件
六 讀取文件內容
(1)一次性讀取文件內容
# 打開文件,并讓file存儲文件指針
file = open('源文件') # 或 open('文件', 'r') 效果是等效的test = file.read()
print(test)
# 關閉文件(必須執行)
file.close()# 打印結果
1234567
abcde
aaaaa
bbbbbbbbb
(2)readline
按行讀取文件內容
1 前言
read
方法默認會把文件的 所有內容一次性讀取到內存- 如果文件太大,對內存的占用會非常嚴重
2 readline
方法
readline
方法可以一次讀取一行的內容readline
方法執行后,會把 文件指針 移動到 下一行,準備下次讀取readline
方法可以利用循環也可以把一個很大的文件一次性讀取出來
“源文件”文件
1234567
abcde
aaaaa
bbbbbbbbb
test1.py文件
# 打開文件,并讓file存儲文件指針
file = open('源文件') # 或 open('文件', 'r') 效果是等效的
while True:# 每次循環,讀取一行test = file.readline() # 如果讀取到末尾的時候,返回空字符串''# 判斷是否讀取到內容 如果文件指針指向結尾,則braekif not test: # 如果 not '' 則為 Truebreakprint(test, end = '')
# 關閉文件(必須執行)
file.close()# 打印結果
1234567
abcde
aaaaa
bbbbbbbbb
(3)使用for lline int file
遍歷文件內容
# 打開文件,并讓file存儲文件指針
file = open('源文件') # 或 open('文件', 'r') 效果是等效的
for line in file:print(line, end = '') # 如果寫的是 print(line) 會每一行下面多打印行空格,因為print會自動打印一行空格
# 關閉文件(必須執行)
file.close()# 打印結果
1234567
abcde
aaaaa
bbbbbbbbb
(4)read(n)
與 readline(n)
可以寫參數,n
表示讀取多少個字符
file.read(5)
只打印前5個字符
# 打開文件,并讓file存儲文件指針
file = open('源文件') # 或 open('文件', 'r') 效果是等效的test = file.read(5) # 只打印前5行
print(test)
# 關閉文件(必須執行)
file.close()# 打印結果
12345
七 文件復制
1 小文件復制
(1 )步驟
- 打開源文件和目標文件
- 源文件以只讀方式打開
- 目標文件以只寫方式打開
- 將原文件的中的內容讀取出來
- 將讀取出來的內容寫入到目標文件
- 關閉兩個文件
(2 )具體實現
源文件
1234567
abcde
aaaaa
bbbbbbbbb
目標文件
復制以后,該文件內容與源文件相同
test2.py
# 1 打開文件
file_read = open('源文件')
file_write = open('目標文件', 'w')
# 2 讀寫文件
text = file_read.read()
text2 = file_write.write(text)
# 3 關閉打開的
file_read.close()
file_write.close()
2 大文件復制
因為文件太大,如果一次性讀取出來的話會占用大量的內存空間,所以分行復制,一行一行的復制
(1)步驟
- 打開源文件和目標文件
- 源文件以只讀方式打開
- 目標文件以只寫方式打開
- 按照一行一行的形式將源文件中的內容復制到目標文件當中去
- 關閉兩個文件
(2)具體實現
# 1 打開文件
file_read = open('源文件')
file_write = open('目標文件', 'w')
# 2 讀寫文件
while True:# 讀取一行內容text = file_read.readline()# 文件指針指向末尾,退出循環if not text:breaktext2 = file_write.write(text)
# 3 關閉打開的
file_read.close()
file_write.close()
八 文件/目錄的常用管理操作
1 基本介紹
-
在終端/文件瀏覽器中可以執行常規的 文件 / 目錄 管理操作,例如:
創建、重命名、刪除、改變路徑、查看目錄內容…
-
在
Python
中,如果用上面的功能的話,需要導入os
模塊
2 文件操作
方法名 | 說明 | 例子 |
---|---|---|
rename | 重命名文件 | os.rename(源文件名,目標文件名) |
remove | 刪除文件 | os.remove(文件名) |
3 目錄操作
如下操作中,文件或者目錄操作都支持 相對路徑 和 絕對路徑
方法名 | 說明 | 例子 |
---|---|---|
listdir | 目標列表 | os.listdir(目標名) |
mikdir | 創建目錄 | os.mikdir(目標名) |
rmdir | 刪除目錄 | os.rmdir(目標名) |
getcwd | 獲取當前目錄 | os.getcwd() |
chdir | 修改工作目錄 | os.chdir(目標目錄) |
path.isdir | 判斷是否是文件 | os.path.isdir(文件路徑) |
九 自動關閉文件的方法
只要離開了縮進范圍,就自動關閉了
1 打開一個文件
可以不手動寫 close 方法關閉文件
with open('test.txt', 'r', encoding='utf-8') as file:content = file.read()print(content)
# 文件已自動關閉
2 同時打開多個文件
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:data = infile.read()outfile.write(data.upper())
# 兩個文件都已自動關閉
十 文件刷新
一般來說不需要手動刷新
下面三種情況需要
實時日志記錄:如果程序可能崩潰,希望日志立即寫入硬盤,而不是一直在內存緩沖區
with open("debug.log", "a") as f:f.write("Error: something went wrong!\n")f.flush() # 確保日志立即寫入,即使程序崩潰
長時間運行的文件寫入:如果文件長時間不關閉,但希望內容盡快寫入硬盤。
也就是如果大文件需要分批次寫入,就需要每隔一段時間就刷新一次。
file = open("data.txt", "w") for i in range(1000000):file.write(f"Line {i}\n")if i % 1000 == 0:file.flush() # 每1000行刷一次,避免內存占用過高 file.close()
多進程/多線程共享文件:如果另一個進程需要立即讀取剛寫入的內容,但文件尚未關閉。
下面的情況不需要手動刷新
- 正常情況:用
with
語句或正確調用了close()
,數據一定會寫入硬盤,無需手動flush()
。- 小文件寫入:如果寫入的數據量小,緩沖區很快填滿,系統會自動刷新。
- 程序正常退出:Python 在程序結束時會自動刷新所有緩沖區
刷新步驟
# 1 打開文件
file = open("XX")
# 2 讀取
text = file.read()
# 3 刷新
flie.flush()
# 4 關閉
file.close() # 千萬不要忘記關閉文件