Python 程序設計入門(024)—— Python 的文件操作
目錄
- Python 程序設計入門(024)—— Python 的文件操作
- 一、文件對象
- 二、讀取文件內容的方法
- 1、read() 方法
- 2、readline() 方法
- 3、readlines() 方法
- 4、使用 for 循環讀取文件內容
- 三、文件指針的操作
- 1、tell() 方法
- 2、seek() 方法
- 四、文件的寫入操作
- 五、使用 with 語句處理文件
- 六、打開文件之前先判斷文件是否存在
- 七、文件的編碼問題
- 1、打開文件時指定文件的編碼格式
- 2、以二進制方式打開文件,然后對讀取的內容進行編碼
- 3、強制以某種模式讀取文件,忽略編碼錯誤
為了能夠長期保存程序中的數據,需要將其保存到磁盤文件中。Python 提供了內置的文件對象和對文件、目錄進行操作的內置模塊。
一、文件對象
Python 中內置了文件(file)對象,使用文件對象時,需要先通過內置的 open() 函數創建一個文件對象,然后通過該對象提供的方法進行操作。
使用 open() 函數一定要保證關閉文件對象,即調用 close() 函數。open() 函數的語法格式如下:
file = open(filename, mode = "r", buffering = -1, encoding = None)
說明:
(1)filename:要創建或打開的文件名(必須),使用單引號或雙引號括起來。如果要打開的文件和當前文件在同一目錄下,可以不帶路徑,否則需要指定完整路徑。
(2)mode:指定文件的打開模式(可選),默認的打開模式為只讀(r),mode 的取值如下表所示:
取值 | 含義 | 說明 |
---|---|---|
t | 文本模式(默認) | |
r | 以只讀模式打開文件。文件的指針將會放在文件的開頭。 | 文件必須存在 |
rb | 以二進制格式打開文件,并且采用只讀模式。文件的指針將會放在文件的開頭。 | 文件必須存在 |
r+ | 打開文件后,可以讀取文件內容,也可以寫入新的內容覆蓋原有內容(不清空原文件,從第一個字符開始逐步替換)。 比如文件中原有內容為:123456789,寫入abc,則文件內容為:abc456789 | 文件必須存在 |
rb+ | 以二進制格式打開文件,并且采用讀寫模式,文件的指針將會放在文件的開頭。 | 文件必須存在 |
w | 以只寫模式打開文件 | 如果文件已存在,則將其覆蓋,否則創建新文件 |
wb | 以二進制格式打開文件,并且采用只寫模式。一般用于非文本文件,如圖片、聲音等。 | 如果文件已存在,則將其覆蓋,否則創建新文件 |
w+ | 打開文件后,先清空原有內容,使其變為一個空文件,對這個空文件有讀寫權限。 | 如果文件已存在,則將其覆蓋,否則創建新文件 |
wb+ | 以二進制格式打開文件,并且采用讀寫模式。一般用于非文本文件,如圖片、聲音等。 | 如果文件已存在,則將其覆蓋,否則創建新文件 |
a | 以追加模式打開文件。如果該文件已存在,文件指針放在文件的末尾(新內容會被寫到已有內容之后)。否則,創建新文件用于寫入。 | 如果文件已存在,則將新內容追加到原文件結尾,否則創建新文件并寫入新內容 |
ab | 以二進制格式打開文件,并且采用追加模式。如果該文件已存在,文件指針將放在文件末尾(新內容會被寫到已有內容之后)。否則,創建新文件用于寫入。 | 如果文件已存在,則將新內容追加到原文件結尾,否則創建新文件并寫入新內容 |
a+ | 以讀寫模式打開文件。如果該文件已存在,文件指針將放到文件的末尾(新內容會被寫到已有內容之后)。否則,創建新文件用于讀寫。 | 如果文件已存在,則將新內容追加到原文件結尾,否則創建新文件并寫入新內容 |
ab+ | 以二進制格式打開文件,并且采用追加模式。如果該文件已存在,文件指針將放到文件末尾(新內容會被寫到已有內容之后)。否則,創建新文件用于讀寫。 | 如果文件已存在,則將新內容追加到原文件結尾,否則創建新文件并寫入新內容 |
mode 參數的用法如下:
常用的 mode 取值組合如下:
(1)r 或 rt:默認模式,文本模式、只讀模式
(2)rb:二進制模式
(3)w 或 wt:文本模式、只寫模式,打開之前文件被清空
(4)wb:二進制模式、寫模式,打開之前文件被清空
(5)a:追加模式,只能寫在文件末尾
(6)a+:可讀寫模式,寫操作只能寫在文件末尾
(7)w+:可讀寫模式,與 a+ 的區別就是寫之前先清空文件內容
(8)r+:可讀寫模式,寫之前先清空文件內容說明:
(1)r(只讀模式)、w(只寫模式)、a(追加模式)為打開文件的基本模式。
(2)b(二進制模式)、t(文本模式)、+(讀寫模式) 與以上三個模式可以混合使用。
(3)r、rb、r+,rb+ 模式要求文件必須存在。r 與 rb 表示只讀模式。r+ 與 rb+ 表示可讀寫,寫入的新內容會替換文件中的原有內容。
(4)w、wb、w+、wb+ 模式下,如果文件已創建,則覆蓋原文件,如果文件不存在,則創建新文件。w 與 wb 表示只能寫入,不能讀取。w+ 與 wb+ 表示可讀寫,但寫入的內容會替換文件中的原有內容。
(5)a、ab、a+、ab+ 模式下,如果文件已創建,則將新內容追加到原文件的結尾,如果文件不存在,則創建新文件并寫入新內容。a 和 ab 表示以追加模式打開文件,無法讀取文件內容。a+ 和 ab+ 表示以讀寫方式打開文件。
(3)buffering:用于指定讀寫文件的緩沖模式(可選),取值為 0 時表示不緩存;取值為 1 時表示緩存;如果取值大于 1,則表示緩沖區的大小。如果取負值,緩沖區的大小則為系統默認。默認值為 -1。
(4)encoding:編碼方式。Windows 系統默認是 gbk 編碼,所以桌面生成的 TXT 之類的文件都是gbk 編碼的。
例如:
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.read())
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
二、讀取文件內容的方法
讀取文件內容通常使用 file 對象的 3 個方法:(1)使用 read() 方法讀取全部或部分內容;(2)使用 readline() 方法逐行讀取文件內容;(3)使用 readlines() 方法讀取所有內容。
也可以使用 for 循環讀取文件內容。
1、read() 方法
read() 方法用于讀取文件的全部或部分內容。read() 方法的語法格式如下:
file.read([size])
說明:
(1)size 為可選參數,用于指定要讀取文件內容的字符數(所有字符 size 均為 1,包括漢字)。如果省略,則返回文件的所有內容。
(2)使用 read() 方法讀取文件內容時,如果文件大于可用內存,則不能實現對文件的讀取,返回空字符串。
例如:
(1)讀取文件的全部內容
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.read())
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
(2)讀取 25 個字符
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.read(25))
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女
2、readline() 方法
readline() 方法用于每次讀取一行數據。readline() 方法的語法格式如下:
file.readline()
例如:
(1)讀取一行數據
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.readline())
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
(2)讀取 5 行數據
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
for i in range(5):print(file1.readline(),end="")
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
(3)讀取全部數據
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
while True:line = file1.readline()if line == "":breakprint(line,end="")
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
3、readlines() 方法
readlines() 方法返回一個列表,列表中每個元素為文件中的行數據。readlines() 方法的語法格式如下:
file.readlines()
例如:
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
list1 = file1.readlines()
print("類型",type(list1))
print("列表長度:",len(list1))
print("列表內容如下:")
print(list1)
print("遍歷列表內容:")
for item in list1:print(item,end="")
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
類型 <class 'list'>
列表長度: 13
列表內容如下:
['姓名,性別,出生日期,院系,班級,手機號\n', '張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216\n', '劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334\n', '張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243\n', '王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654\n', '張海洋,男,2002-7-9,機電學院,機制211班,13603737778\n', '劉思雨,女,2001-8-30,機電學院,機制211班,13603736538\n', '王彥強,男,2002-7-31,機電學院,機制212班,13603736528\n', '劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235\n', '王鵬,男,2002-9-27,機電學院,機制201班,13603734215\n', '劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685\n', '王蕓,女,2002-6-30,文法學院,法學201班,13603733322\n', '劉云飛,男,2002-9-21,文法學院,法學201班,13603733415']
遍歷列表內容:
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
4、使用 for 循環讀取文件內容
使用 for 循環讀取文件內容格式如下:
file1 = open(filename, mode)
for line in file:print(line)或:
file1 = open(filename, mode)
for line in file.readlines():print(line)
例如:
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r", encoding = 'utf-8') as file1:for line in file1:print(line,end="")
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
或者:
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r", encoding = 'utf-8') as file1:for line in file1.readlines():print(line,end="")
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
三、文件指針的操作
除了文件讀取操作,有時還需要進行獲取或移動指針位置的操作。
1、tell() 方法
tell() 方法返回一個整數,表示文件指針的當前位置,即在二進制模式下距離文件頭的字節數。tell() 方法的語法格式如下:
file.tell()
說明:使用 tell() 方法返回的位置與 read() 中 size 參數不同。read() 方法中的 size 參數為字符數,tell() 方法返回的是字節數。漢字所占的字節數和字符編碼有關,如果采用 GBK 編碼,一個漢字占 2 個字節,如果采用 UTF-8 編碼,一個漢字占 3 個字節。
修改放表稱為單鏈表。
file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
file1.readlines()
print("readlines()方法把指針移動到文件結尾:",file1.tell())
file1.seek(0) # 把指針移動到文件頭
file1.readline()
print("readline()方法把指針移動到下一行的開頭:",file1.tell())
file1.seek(0) # 把指針移動到文件頭
file1.read(25)
print("read(25)方法把指針移動到第25個字符:",file1.tell())
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
readlines()方法把指針移動到文件結尾: 825
readline()方法把指針移動到下一行的開頭: 52
read(25)方法把指針移動到第25個字符: 62
2、seek() 方法
seek() 方法用于將文件的指針移動到新的位置,位置通過字節數指定。這里的數值與 tell() 方法返回的數值計算方法一致。seek() 方法的語法格式如下:
file.seek(offset [,whence])
說明:
(1)offset:用于指定移動的字節數。具體位置與 whence 參數有關。
(2)whence:指定從什么位置開始計算。值為 0 表示從文件頭開始計算(默認),為 1 表示從當前位置開始計算,為 2 表示從文件尾開始計算。默認值為 0。
例如:
file1 = open("d:\stu.txt",mode = "rb")
file1.seek(0) # 把指針移動到文件頭
print(file1.tell())file1.seek(10) # 把指針移動到離文件頭10個字節的位置
print(file1.tell())file1.seek(20,1) # 再向后移動20個自節
print(file1.tell())file1.seek(0,2) # 把指針移動到文件尾
print(file1.tell())file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
0
10
30
825
四、文件的寫入操作
利用文件對象的 write() 方法,可以向文件中寫入內容。write() 方法的語法格式如下:
file.write(string)
對于一個文件來說,能不能寫入數據、數據的寫入方式與打開文件的模式有關。
(1)如果一個文件以只讀方式(r)打開,則無法寫入
代碼如下:
file1 = open("d:\stu.txt",mode = "r")
file1.write("新增一條記錄:")
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 2, in <module>file1.write("新增一條記錄:")
io.UnsupportedOperation: not writable
(2)如果一個文件以只寫方式打開,則無法讀取內容
代碼如下:
file1 = open("d:\stu.txt",mode = "w")
file1.readlines()
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 2, in <module>file1.readlines()
io.UnsupportedOperation: not readable
(3)文件以只寫方式打開,寫入內容
代碼如下:
file1 = open("d:\\test123.txt", mode = "w")
file1.write("Hello Python!")
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
>>>
(4)文件以可讀寫(r+)方式打開,寫入內容
代碼如下:
file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r+")
file1.write("New!")
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Hello Python!
13
4
New!o Python! # r+ 模式在寫入時,并不清空文件,而是從第一個字符開始替換原有的內容
13
(5)文件以可讀寫(w+)方式打開,寫入內容
代碼如下:
file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "w+")
file1.write("New!")
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Hello Python!
13
4
New! # w+ 模式在寫入時,先清空原有文件,再寫入新內容
4
(6)文件以追加方式打開,寫入內容
代碼如下:
file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "a")
file1.write("New!")
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()程序運行結果如下:
>>>
===================== RESTART: C:\Python\Python38\First.py =====================
Hello Python!
13
17
Hello Python!New!
17
五、使用 with 語句處理文件
文件使用完要及時關閉。如果忘記關閉文件,可能出現一些意想不到的結果。另外,如果在打開文件時出現了異常,將導致文件不能被及時關閉。為了避免這些問題的產生,可以使用 with 語句實現在處理文件時,無論是否拋出異常,都能保證 with 語句執行完后關閉已經打開的文件。
with 語句的語法格式如下:
with expression as target:with-body
說明:
(1)expression:指定一個表達式,可以是打開文件的 open() 函數。
(2)with-body:指定 with 語句體,其中可以是執行 with 語句后相關的一些操作。如果不想執行任何操作,可以用 pass 語句代替。
例如:
with open("d:\\stu.txt", mode = "r" ,encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
六、打開文件之前先判斷文件是否存在
使用 open() 函數打開文件時,如果要打開的文件不存在,則會出現異常。可以使用 os.path 模塊提供的 exists() 函數判斷文件是否存在。
例如:
(1)以只讀(r)方式打開一個不存在的文件時出現異常
代碼如下:
with open("d:\\stu001.txt", mode = "r" ,encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 1, in <module>with open("d:\\stu001.txt", mode = "r" ,encoding = "utf-8") as file1:
FileNotFoundError: [Errno 2] No such file or directory: 'd:\\stu001.txt'
(2)打開之前先判斷文件是否存在
代碼如下:
import os
if os.path.exists("d:\\stu001.txt"):with open("d:\\stu001.txt", mode = "r" ,encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
要打開的文件不存在!
七、文件的編碼問題
由于文件保存格式不同,在讀取文件時如果格式不正確,將會出現亂碼或拋出異常。
例如:
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 5, in <module>line = file1.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 36: illegal multibyte sequence
可以使用如下三種方法解決文件的編碼格式問題:
1、打開文件時指定文件的編碼格式
例如,在打開文件時,指定編碼格式為 【utf-8】,代碼如下:
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r", encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
2、以二進制方式打開文件,然后對讀取的內容進行編碼
讀取文件時如果出現字符編碼錯誤,用二進制方式打開文件就不會出現錯誤了,但需要在讀取文件時進行編碼。先使用 isinstance() 函數判斷讀取的內容是否為 str 類型,如果是,則直接讀取文件內容。如果不是,則使用異常處理程序嘗試使用 utf-8 方式解碼,否則使用 GBK 解碼。
代碼如下:
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "rb") as file1:for line in file1.readlines():if isinstance(line,str):print(new,end="")else:try:new = line.decode("utf-8")print(new,end="")except:try:new = line.decode("GBK")print(new,end="")except:pass
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415
3、強制以某種模式讀取文件,忽略編碼錯誤
例如:以二進制方式讀取文件的內容,然后用 GBK 編碼強制讀取該文件。
代碼如下:
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "rb") as file1:text = file1.read()new = text.decode("GBK",errors = "ignore")print(new)
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
濮撳悕,鎬у埆,鍑虹敓鏃ユ湡,闄㈢郴,鐝綰,鎵嬫満鍙
寮犲鉤,濂,2002-12-5,緇忔祹涓庣$悊瀛﹂櫌,淇$201鐝,13603735216
鍒樻稕,鐢,2002-10-15,緇忔祹涓庣$悊瀛﹂櫌,淇$201鐝,13603733334
寮犻潤闈,濂,2003-8-6,緇忔祹涓庣$悊瀛﹂櫌,淇$212鐝,13603734243
鐜嬪己,鐢,2003-6-25,緇忔祹涓庣$悊瀛﹂櫌,淇$212鐝,13603736654
寮犳搗媧,鐢,2002-7-9,鏈虹數瀛﹂櫌,鏈哄埗211鐝,13603737778
鍒樻濋洦,濂,2001-8-30,鏈虹數瀛﹂櫌,鏈哄埗211鐝,13603736538
鐜嬪濺寮,鐢,2002-7-31,鏈虹數瀛﹂櫌,鏈哄埗212鐝,13603736528
鍒樻湞杈,鐢,2001-7-6,鏈虹數瀛﹂櫌,鏈哄埗201鐝,13603736235
鐜嬮箯,鐢,2002-9-27,鏈虹數瀛﹂櫌,鏈哄埗201鐝,13603734215
鍒樼嚂鐕,濂,2001-8-22,鏂囨硶瀛﹂櫌,娉曞201鐝,13603733685
鐜嬭姼,濂,2002-6-30,鏂囨硶瀛﹂櫌,娉曞201鐝,13603733322
鍒樹簯椋,鐢,2002-9-21,鏂囨硶瀛﹂櫌,娉曞201鐝,13603733415
以二進制方式讀取文件的內容,然后用 utf-8 編碼強制讀取該文件。
import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "rb") as file1:text = file1.read()new = text.decode("utf-8",errors = "ignore")print(new)
else:print("要打開的文件不存在!")程序運行結果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性別,出生日期,院系,班級,手機號
張平,女,2002-12-5,經濟與管理學院,信管201班,13603735216
劉濤,男,2002-10-15,經濟與管理學院,信管201班,13603733334
張靜靜,女,2003-8-6,經濟與管理學院,信管212班,13603734243
王強,男,2003-6-25,經濟與管理學院,信管212班,13603736654
張海洋,男,2002-7-9,機電學院,機制211班,13603737778
劉思雨,女,2001-8-30,機電學院,機制211班,13603736538
王彥強,男,2002-7-31,機電學院,機制212班,13603736528
劉朝輝,男,2001-7-6,機電學院,機制201班,13603736235
王鵬,男,2002-9-27,機電學院,機制201班,13603734215
劉燕燕,女,2001-8-22,文法學院,法學201班,13603733685
王蕓,女,2002-6-30,文法學院,法學201班,13603733322
劉云飛,男,2002-9-21,文法學院,法學201班,13603733415