Python 程序設計入門(024)—— Python 的文件操作

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42615.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42615.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

麥肯錫發布《2023科技趨勢展望報告》,生成式AI、下一代軟件開發成為趨勢,軟件測試如何貼合趨勢?

近日&#xff0c;麥肯錫公司發布了《2023科技趨勢展望報告》。報告列出了15個趨勢&#xff0c;并把他們分為5大類&#xff0c;人工智能革命、構建數字未來、計算和連接的前沿、尖端工程技術和可持續發展。 類別一&#xff1a;人工智能革命 生成式AI 生成型人工智能標志著人工智…

CSRF

文章目錄 CSRF(get)CSRF(post)CSRF Token CSRF(get) 根據提示的用戶信息登錄 點擊修改個人信息 開啟bp代理&#xff0c;點擊submit 攔截到請求數據包 瀏覽器關閉代理 刷新頁面 CSRF(post) 使用BP生成CSRF POC post請求偽造&#xff0c;可以通過釣魚網站&#xff0c;誘導用戶去…

docker 常用命令大全

1.查看docker版本&#xff1a; docker -v2.檢查 Docker 是否正在運行: systemctl status docker3.重啟docker服務: systemctl restart docker4.列出本地鏡像: docker images5.列出正在運行的容器&#xff1a; docker ps6.列出所有容器&#xff08;包括停止的&#xff09;&…

css 實現文字橫向循環滾動

實現效果 思路 ## 直接上代碼,html部分 //我這里是用的uniapp <view class"weather_info_wrap"><view class"weather_info">當前多云&#xff0c;今晚8點轉晴&#xff0c;明天有雨&#xff0c;溫度32攝氏度。</view><view class&qu…

CF1005A Tanya and Stairways 題解

題目傳送門 題目意思&#xff1a; 給你 n n n 個數&#xff0c;如果第 i i i 個數小于或等于第 i ? 1 i-1 i?1 個數&#xff0c;就輸出這個數。 思路&#xff1a; 輸入后直接遍歷判斷即可。 代碼&#xff1a; #include<bits/stdc.h> using namespace std; int …

解決IDEA tomcat控制臺只有server日志

解決IDEA tomcat控制臺只有server日志 確認tomcatxxx/conf/logging.properties文件是否存在&#xff0c;存在就會有。前提是在run configuration配置了打印多個日志

uniapp封裝組件,選中后右上角顯示對號√樣式(通過css實現)

效果&#xff1a; 一、組件封裝 1、在項目根目錄下創建components文件夾&#xff0c;自定義組件名稱&#xff0c;我定義的是xc-button 2、封裝組件代碼 <template><view class"handle-btn"><view :class"handleIdCode 1 ? select : unSelec…

螞蟻數科持續發力PaaS領域,SOFAStack布局全棧軟件供應鏈安全產品

8月18日&#xff0c;記者了解到&#xff0c;螞蟻數科再度加碼云原生PaaS領域&#xff0c;SOFAStack率先完成全棧軟件供應鏈安全產品及解決方案的布局&#xff0c;包括靜態代碼掃描Pinpoint、軟件成分分析SCA、交互式安全測試IAST、運行時防護RASP、安全洞察Appinsight等&#x…

【電商領域】Axure在線購物商城小程序原型圖,品牌自營垂直電商APP原型

作品概況 頁面數量&#xff1a;共 60 頁 兼容軟件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 應用領域&#xff1a;網上商城、品牌自營商城、商城模塊插件 作品申明&#xff1a;頁面內容僅用于功能演示&#xff0c;無實際功能 作品特色 本作品為品牌自營網上商城…

無涯教程-Perl - warn函數

描述 此函數將LIST的值打印到STDERR。基本上與die函數相同,除了不對出口進行任何調用并且在eval語句內不引發異常。這對于引發錯誤而不導致腳本過早終止很有用。 如果變量$包含一個值(來自先前的eval調用),并且LIST為空,則$的值將以。\t.caught打印。附加到末尾。如果$和LIST…

MySQL數據庫概述

MySQL數據庫概述 1 SQL SQL語句大小寫不敏感。 SQL語句末尾應該使用分號結束。 1.1 SQL語句及相關操作示例 DDL&#xff1a;數據定義語言&#xff0c;負責數據庫定義、數據庫對象定義&#xff0c;由CREATE、ALTER與DROP三個語法所組成DML&#xff1a;數據操作語言&#xff…

關于小程序收集用戶手機號行為的規范

手機號在日常生活中被廣泛使用&#xff0c;是重要的用戶個人信息&#xff0c;小程序開發者應在用戶明確同意的前提下&#xff0c;依法合規地處理用戶的手機號信息。 而部分開發者在處理用戶手機號過程中&#xff0c;存在不規范收集行為&#xff0c;影響了用戶的正常使用體驗&a…

ElasticSearchConfig

1. 添加配置 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>2. es 配置信息 import org.apache.http.HttpHost; import org.apache.http.auth.Au…

k8s簡介、虛擬機快速搭建k8s集群、集群管理方式及K8S工作原理和組件介紹

文章目錄 1、k8s簡介1.1、部署方式的變遷1.2、定義1.3、Kubernetes提供的功能 2、虛擬機快速搭建k8s集群2.1、虛擬機配置&#xff08;centos7 2G內存2個處理器&#xff09;2.2、基礎環境準備2.3、docker安裝&#xff08;易踩坑&#xff09;2.4、安裝k8s組件2.5、master節點部署…

在linux系統中修改mysql數據目錄

目錄 1.查看mysql默認存儲路徑2.停止mysql服務3.移動或復制原數據目錄4.修改配置文件5.修改啟動文件6.配置AppArmor訪問控制規則7.重啟apparmor服務8.啟動mysql 1.查看mysql默認存儲路徑 在/etc/mysql/mysql.conf.d/mysqld.cnf中的datadir配置項。 datadir /var/lib/mysql2…

提高批量爬蟲工作效率

大家好&#xff01;作為一名專業的爬蟲程序員&#xff0c;我今天要和大家分享一些關于提高批量爬蟲工作效率的實用技巧。無論你是要批量采集圖片、文本還是視頻數據&#xff0c;這些經驗都能幫助你在大規模數據采集中事半功倍。廢話不多說&#xff0c;讓我們開始吧&#xff01;…

SUMO 創建帶有停車位的充電站 在停車位上充電

前言 SUMO提供的Charging Station是沒有停車位的&#xff0c;車輛只有在通過充電站區域或者停在充電站區域內時才能被充電&#xff0c;這時充電的車輛就會占用道路。然而&#xff0c;真實世界中的情況通常是充電站設在路邊&#xff0c;且提供一定量的車位用于停車&#xff0c;…

半導體自動化專用靜電消除器主要由哪些部分組成

半導體自動化專用靜電消除器是一種用于消除半導體生產過程中的靜電問題的設備。由于半導體制造過程中對靜電的敏感性&#xff0c;靜電可能會對半導體器件的質量和可靠性產生很大的影響&#xff0c;甚至造成元件損壞。因此&#xff0c;半導體生產中采用專用的靜電消除器是非常重…

setfacl給jenkins用戶加權限

用setfacl給jenkins用戶加一個/tmp的權限 setfacl是set File ACL&#xff08;訪問控制列表&#xff09;的縮寫 如果你想遞歸地將它應用到所有子目錄&#xff1a;添加-R標志&#xff0c;如下所示&#xff1a; yum -y install aclsetfacl -R -m u:jenkins:rwx /tmp Give speci…

Linux Day09

目錄 一、進程替換 二、Linux信號的使用 2.1 kill() 發送信號 2.2 signal() 改變進程對信號的響應方式 2.3 處理僵死進程 2.3.1 在信號處理函數中調用wait 2.3.2 Linux特有的 2.3.3 結果 一、進程替換 linux上創造一個新進程&#xff0c;沒有create創建方法&#xf…