Python面向對象之文件操作 , 內容 文件的概念,文件的基本操作,文件/目錄的常用管理操作,文本文件的編碼格式。其中 文件的概念 包括 文件的概念和作用,文件的存儲方式;文件的基本操作 包括 文件操作步驟,操作文件的方法/函數,read方法,open函數,readline按行讀取文件內容;文件/... ...
文件的概念
文件的概念和作用
- 電腦的文件,就是存儲在某種長期存儲設備上的一段數據;長期存儲設備包括:U盤,硬碟,移動硬碟,光碟,等;
- 文件的作用:將數據長期保存,在需要的時候使用;
文件的存儲方式
在電腦中,文件是以二進位的形式保存在磁碟上的;
文本文件和二進位文件
文本文件
- 可以用文本編輯軟體查看;
- 本質上還是二進位文件;
例如:python源文件。
二進位文件
- 保存的文件不是直接給人閱讀的,而是提供給其他軟體使用的;
- 二進位文件不能會用文本編輯軟體查看;
例如:圖片文件,音頻文件等
文件的基本操作
文件操作步驟
在電腦中操作文件的步驟時分固定,一共包含三個步驟:
- 打開文件;
- 讀,寫文件;讀:將文本內容讀入記憶體;寫:將記憶體內容寫入文本;
- 關閉文件;
操作文件的方法/函數
在python中操作文件需要記住一個函數和兩個方法
序號 | 函數/方法 | 說明 |
---|---|---|
1 | open | 打開文件,返迴文件操作對象; |
2 | read | 將文件內容讀取到記憶體; |
3 | write | 將指定內容寫入到文件; |
4 | close | 關閉文件; |
- open函數負責打開文件,返迴文件操作對象;
- 其餘三個方法需要通過文件對象調用;
read方法-讀取文件
open函數的第一個參數是要打開的文件名(文件名區分大小寫);
如果文件存在,返迴文件操作對象
如果文件不存在,會拋出異常
read方法可以一次性讀入並返迴文件的所有內容;
close方法負責關閉文件;
如果忘記關閉文件,會造成系統資源消耗,而且會影響到後續對文件的訪問;
註意:read方法執行後,會把文件指針移動到文件的末尾;
提示:在開發中,通常會先編寫打開和關閉的代碼,再編寫中間針對文件的讀寫操作;
讀取文件示例
# 打開文件
file = open("hello.txt")
# 讀取文件
text = file.read()
print(text)
# 關閉文件
file.close()
# welcome to hello.txt
# this is a test file.
文件指針
- 文件指針標識 從哪個位置開始讀取數據;
- 第一次打開文件時,通常文件指針會指向文件的開始位置;
- 當執行了read方法後,文件指針會移動到讀取內容的末尾;預設情況下會移動到文件末尾;
所以,如果在同一次打開文件中,執行了一次read方法,讀取所有內容,再次調用read方法的話,就不能夠再獲得內容了;這是因為第一次讀取之後,文件指針移動到了文件末尾,再次調用不會讀取到任何的內容;
文件指針示例
# 打開文件
file = open("hello.txt")
# 讀取文件
text = file.read()
print(text)
print(len(text))
print("-"*50)
# 再次讀取文件
text1 = file.read()
print(text1)
print(len(text1))
# 關閉文件
file.close()
# welcome to hello.txt
# this is a test file.
# 42
# --------------------------------------------------
# 0
open函數-打開文件的方式
open函數預設以只讀方式打開文件,並且返迴文件對象
open函數語法如下:
f = open("文件名", "訪問方式")
open打開文件情況羅列
訪問方式 | 說明 |
---|---|
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭,這是預設模式。如果文件不存在,拋出異常 |
w | 以只寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件 |
a | 以追加方式打開文件。如果文件已存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入。 |
r+ | 以讀寫方式打開文件。文件的指針將會放在文件的開頭。如果文件不存在,拋出異常。 |
w+ | 以讀寫方式打開文件。如果文件村子會被覆蓋。如果文件不存在,創建新文件。 |
a+ | 以讀寫方式打開文件。如果該文件已存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入。 |
打開方式其實還有"rb","wb","wb+",...等,這是針對二進位文件的方式。
提示
- 頻繁的移動文件指針,會影響文件的讀寫效率,開發中更多的時候會以只讀,只寫的方式來操作文件。
追寫文件示例
file = open("hello.txt", "a")
file.write("hello world")
file.close()
按行讀取文件內容
- read方法預設會把文件的所有內容一次性讀取到記憶體;
- 如果文件太大,對記憶體的占用會非常嚴重。
readline方法
- readline方法可以一次讀取一行內容;
- 方法執行後,會把文件指針移動到下一行,準備再次讀取;
讀取指定行數數據
file = open("hello.txt")
line1 = file.readline()
print(line1)
line2 = file.readline()
print(line2)
file.close()
# 1.welcome to hello.txt
# 2.this is a test file.
分行讀取整個文件:
hello.txt內容
1.welcome to hello.txt
2.this is a test file.
3.hello world
readline_test.py內容
file = open("hello.txt")
while 1:
line = file.readline()
print(line, end="")
if not line:
break
file.close()
# 運行結果
# 1.welcome to hello.txt
# 2.this is a test file.
# 3.hello world
小文件複製示例
# 打開文件
read_file = open("hello.txt")
write_file = open("hello_small.txt", "w")
# 讀寫文件
text = read_file.read()
write_file.write(text)
# 關閉文件
read_file.close()
write_file.close()
大文件複製示例
# 打開文件
read_file = open("hello.txt")
write_file = open("hello_big.txt", "w")
# 讀寫文件
while 1:
# 讀取一行內容
text = read_file.readline()
# 判斷是否有內容
if not text:
break
# 寫入複製文件
write_file.write(text)
# 關閉文件
read_file.close()
write_file.close()
文件/目錄的常用管理操作
- 在終端/文件瀏覽器中,可以執行常規的文件/目錄管理操作,例如:創建,重命名,刪除,改變路徑,查看目錄內容等等。
- 在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編碼等;
- python2.x預設使用ASCII編碼;
- python3.x預設使用UTF-8編碼;
ASCII編碼和UNICODE編碼
ASCII編碼
- 電腦中只有256個ASCII字元;
- 一個ASCII在記憶體中占用1個位元組的空間;而8個0/1的排列組合方式一共有256中,也就是2**8
UTF-8編碼
- 電腦中使用的1-6個位元組來表示一個utf-8位元組,涵蓋了地球上幾乎所有地區的文字;
- 大多數漢字會使用3個位元組來表示;
- utf-8是UNICODE編碼的一種編碼格式。
python2.x中使用中文
在python2.x文件的第一行增加以下代碼,解釋器會以utf-8編碼來處理python文件;
# *-* coding:utf8 *-*
上面這種是官方推薦使用的,也可以使用下麵這種方式:
# coding=utf8
unicode字元串前加u
- 在python2.x中,即使指定了文件使用utf-8的編碼格式,但是在遍歷字元串時,仍然會以位元組為單位遍歷字元串;
- 要能夠正確的遍歷字元串,在定義字元串時,需要在字元串的引號前,增加一個小寫字母u,告訴解釋器這是一個unicode字元串(使用utf-8編碼格式的字元串)。
例如下麵的代碼:
test_str = "hello世界"
print(test_str)
在2和3下都會正確執行,但是當我們遍歷輸出字元串時,就會出現不一樣的情況;
test_str = "hello世界"
print(test_str)
for i in test_str:
print(i)
在python3中可以正常執行以上代碼;
但是在python2中,可以輸出完整字元,遍歷時輸出的結果中"世界"顯示的是六行特殊字元;
解決為 定義字元串時,需要在字元串的引號前,增加一個小寫字母u。
示例如下:
test_str = u"hello世界"
print(test_str)
for i in test_str:
print(i)