文件的基本操作
操作文件的步驟
在計算機中要操作文件的套路非常固定,包含以下三個步驟
- 打開文件(首先要先找到文件並打開.)
- 讀,寫文件
讀:將文件內容讀入內存
寫:將內存內容寫入文件 - 關閉文件
操作文件的函數
在python中要操作文件需要記住以下函數
序號 | 函數/方法 | 說明 |
---|---|---|
01 | open | 打開文件,並且返回文件操作對象 |
02 | read | 將文件內容讀取到內存 |
03 | write | 將制定內容寫入文件 |
04 | close | 關閉文件 |
open 函數負責打開文件,並且返回文件對象.read/write/close 三個方法都需要通過文件對象來調用
打開文件的方式
打開文件使用 python 內置的open()函數
open()函數默認以只讀方式打開文件,並且返回一個文件對象file object(文件對象), 最常用的就是使用 3 個參數(還要其他的可選參數)
語法格式:
file = open(filename[, mode, encoding]) # ("文件名", "訪問方式","編碼")
參數說明:
第一個參數:filename是指的文件也包含路徑. 路徑可以是相對路徑, 也可以是絕對路徑. 不過路徑分隔符要注意:window 下是反斜槓\和 mac 和 linux 下是/
第二個參數:mode是打開文件的模式. 可選. 默認是隻讀和文本模式(rt).支持如下模式:
Character | Meaning |
---|---|
‘r’ | open for reading (default) |
‘w’ | open for writing, truncating the file first |
‘x’ | create a new file and open it for writing |
‘a’ | open for writing, appending to the end of the file if it exists |
‘b’ | binary mode |
‘t’ | text mode (default) |
‘+’ | open a disk file for updating (reading and writing) |
第三個參數:encoding,如果是文本文件, 則最好指定一下文本文件的編碼.否則對一些非ascii字符沒有辦法解碼. 目前一般文件都使用utf-8
返回值:返回值就是一個文件對象. 使用這個文件的一些 api 可以操作文件內
示例代碼
file = open("test.txt", "rt", encoding="utf-8") # 默認就是 rt 表示對只讀文本文件, 並且指定文件編碼.
常用的文件打開模式mode
序號 | 訪問方式 | 說明 |
---|---|---|
01 | r | 等價於rt,以只讀方式打開文件。文件的指針將會放在文件的開頭,這是默認模式。如果文件不存在,拋出異常 |
02 | w | 等價於wt,以只寫的方式打開文件(沒有讀的權限)。如果文件存在會被覆蓋(會先把文件的長度置 0 (文件截斷爲0))。如果文件不存在,創建新文件 |
03 | a | 等價於at,以追加方式打開文件。如果文件已經存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入 |
04 | r+ | 等價於r+t,以讀寫方式打開文件。文件的指針將會放在文件的開頭。如果文件不存在,拋出異常 |
05 | w+ | 等價於w+t,以讀寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件 |
06 | a+ | 以覆寫方式打開文件。如果該文件已存在,文件指針將會訪問文件的結尾。如果文件不存在,創建新文件寫入 |
頻繁的移動文件指針,會影響文件的讀寫效率,開發中更多的時候會以只讀,只寫的方式來操作文件
文件的讀和寫
- 文件讀取
open 函數的第一個參數是要打開的文件名(文件名區分大小寫:如果文件存在,返回文件操作對,如果文件不存在,會拋出異常
read 方法可以一次性讀入並返回文件的所有內容
close 方法負責關閉文件
如果忘記關閉文件,會造成系統資源消耗,而且會影響到後續對文件的訪問
注意:方法執行後,會把文件指針移動到文件的末尾
# 1.打開
file = open("文件路徑")
# 2.讀取
text = file.read()
print(text)
# 3.關閉
file.close(
提示:在開發中,爲了防止忘記關閉文件,通常會編寫打開和關閉的代碼,再編寫中間針對文件的讀/寫操作
read 的幾種方式
- 使用read(num)可以從文件中讀取數據,num表示要從文件中讀取的數據的長度(單位是字節),如果沒有傳入num,那麼就表示讀取文件中所有的數據
- 讀取一行
read 方法默認會把文件的所有內容一次性讀取到內存
如果文件太大,對內存的佔用會非常嚴重,可以使用 readline 方法
readline 方法可以一次讀取一行內容
方法執行後,會把文件指針移動到下一行,準備再次讀取
讀取大文件的正確姿勢
# 打開文件
file = open("文件名")
# 循環讀取文件
while True:
# 讀取一行內容
text = file.readline()
# 判斷是否讀到內容
if not text:
break
# 每讀取一行的末尾已經有了一個"\n"
print(text, end = "")
# 關閉文件
file.close()
- 使用for … in…讀取 效率更高
# 使用for循環進行讀取更效率
file = open('demo1.txt', 'r+t', encoding='utf-8')
for line in file:
print(line)
- 使用readlines()進行讀取,會把讀取的每行內容放在一個列表當中
file = open('demo1.txt', 'r+t', encoding='utf-8')
# 使用readlines()進行讀取,會把讀取的每行內容放在一個列表當中
print(file.readlines())
- 文件寫出
write(string)
向文件中寫入字符串, 並返回寫入的字符的個數.
file = open("new.txt", "w+", encoding="utf-8")
count = file.write("你好啊abc")
print(count)
注意:
- 如果文件模式使用
r+
, 則文件不存在會拋出異常. w+
, 文件不存在會自動創建文件, 並寫入a+
, 追加的方式寫入文件
如果是寫入的其他類型的數據, 則寫之前需要手動轉換
根據你打開文件的模式, 來決定到底是轉成字符串還是轉成字節對象
file = open("new.txt", "w+t", encoding="utf-8")
nums = ("a", "b", "你 好", 30)
file.write(str(nums))
文件內容
writelines()
把存儲字符串的列表直接寫入到文件中
寫入的時候不會自動幫你格式化, 會把每個字符串元素挨個寫在一起, 你應該在寫入之前自行處理好格式
file = open("new.txt", "w+t", encoding="utf-8")
nums = ("a", "b", "你好")
file.writelines(nums)
- 其他方法
文件指針(瞭解)
文件指針 標記從哪個位置開始讀取數據
第一次打開文件時,通常文件指針會指向文件的開始位置
當執行了read方法後,文件指針會移動到讀取內容的末尾
tell(), 和 seek()
tell()
返回文件指針在當前文件中的位置. 返回的值是以字節爲單位的.
seek()
設置文件指針的位置
file = open("new.txt", "r+t", encoding="utf-8")
print(file.tell()) # 文件打開之後指針位置默認爲 0
print(file.read(1))
print(file.tell())
file.seek(4)
print(file.read(1))
文件的關閉
關閉文件
爲什麼要關閉文件:
- 打開文件之後總是會佔用一定的系統資源, 所以當你對文件操作完畢之後, 應該關閉文件.
- 寫入數據的時候, 並不是立即寫入到文件中, 一般先放入到緩衝區. 當關閉文件的時候, 再從緩衝區寫入到文件中. (也可以手動調用
flush()方法寫入
)
關閉文件調用文件對象的close()
方法即可.
文件的複製
讀取源文件的數據,寫給目標文件
小文件:使用read(),write()
大文件:使用readline(),write()
文件/目錄的常用管理操作
在終端/文件瀏覽器中可以執行常規的文件/目錄 管理操作
例如:創建,重命名,刪除,改變路徑,查看目錄內容……
在Python中,如果希望通過程序實現上述功能,需要導入os模塊
文件操作
序號 | 方法名 | 說明 | 示例 |
---|---|---|---|
01 | rename | 重命名文件 | os.rename(源文件名,目標文件名) |
02 | remove | 刪除文件 | os.remove(文件名) |
目錄操作
序號 | 方法名 | 說明 | 示例 |
---|---|---|---|
01 | listdir | 目錄列表 | os.listdir(目錄名) |
02 | mkdir | 創建目錄 | os.mkdir(目錄名) |
03 | rmdir | 刪除目錄 | os.rmdir(目錄名) |
04 | getcwd | 獲取當前目錄 | os.getcwd() |
05 | chdir | 修改工作目錄 | os.chdir(目標目錄) |
06 | path.isdir | 判斷是否是文件 | os.path.isdir(文件路徑) |
提示:文件或目錄操作都支持相對路徑和絕對路徑
文本文件的編碼格式
文本文件存儲的內容是基於字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等
Python 2.x 默認使用ASCII編碼
Python 3.x 默認使用UTF-8編碼
ASCII編碼
計算機中只有256個ASCII字符
一個ASCII在內存中佔用1個字節的空間
UTF-8 編碼格式
計算機中使用1-6個字節來表示一個UTF-8字符,涵蓋了所有文字。
大多數漢字使用3個字節
[擴展內容]
在Python 2.x中第一行,增加以下代碼,解釋器會以utf-8編碼來處理python文件
# *-* coding:utf8 *-*
也可以使用
# coding=utf8
在Python 2.x中,即使指定了文件使用UTF-8
####2.9使用 with 方式打開文件
打開文件的時候使用with
關鍵字, 可以在文件操作完畢之後在合適時間自動關閉文件, 即使發生了異常也能關閉文件.
而且代碼要比處理異常的語句少
with open("new.txt", "r+", encoding="utf-8") as file:
print(file.read())