Python文件操作
文章目錄
- Python文件操作
- @[toc]
- 1.文件的編碼
- 2.文件打開、讀取(r模式)、關閉
- 3.文件的寫入(w模式)
- 4.文件的追加寫入(a模式)
- 5.綜合案例
文章目錄
- Python文件操作
- @[toc]
- 1.文件的編碼
- 2.文件打開、讀取(r模式)、關閉
- 3.文件的寫入(w模式)
- 4.文件的追加寫入(a模式)
- 5.綜合案例
1.文件的編碼
- 意義:計算機只能識別0和1,計算機使用編碼技術將豐富文本文件的內容翻譯成0和1存入,同時也需要編碼將計算機保存的0和1反向翻譯回可以識別的內容。計算機有許多可用編碼,例如UTF-8、GBK、Big5等。不同的編碼,將內容翻譯成二進制也是不同的。UTF-8是目前全球通用的編碼格式。
2.文件打開、讀取(r模式)、關閉
-
打開文件:open(name,mode,encoding),name是要打開的目標文件名的字符串(文件的具體路徑),mode是設置打開文件的模式(訪問文件的模式):只讀、寫入、追加等,encoding是編碼格式(推薦使用UTF-8)。使用該函數,可以打開一個已經存在的文件或者創建一個新文件。
幾種訪問文件的模式:
模式 | 描述 |
---|---|
r | 以只讀方式打開文件,文件的指針將會放在文件的開頭,這是默認模式 |
w | 以寫入的模式打開文件,如果該文件已經存在則打開該文件,并從頭開始編輯,原有內容會被刪除,如果該文件原先不存在,則創建新文件。 |
a | 打開一個文件用于追加。如果該文件存在,新的內容將會被寫到已有內容之后,如果該文件不存在,創建新文件進行寫入。 |
- 文件的打開、讀取、關閉操作
操作 | 功能 |
---|---|
文件對象 = open (file, mode, encoding) | 打開文件獲得文件對象 |
文件對象.read (num) | 讀取指定長度字節,不指定 num 讀取文件全部 |
文件對象.readline () | 讀取一行,多寫幾個就是依次讀取 |
文件對象.readlines () | 讀取全部行,封裝得到列表 |
for line in 文件對象 | for 循環文件行,一次循環得到一行數據 |
文件對象.close () | 關閉文件對象 |
with open() as f | 通過 with open 語法打開文件,自動創建文件對象,并可以自動關閉文件 |
# 每個example.txt文件都是
'''
1234567
abcdefg
8910
hijk
'''# 打開文件,open("文件路徑", "讀取方式", encoding="編碼類型")
f = open("D:/pythonlearning/example.txt", "r", encoding="UTF-8")
print(type(f))
print(20 * "*")# 讀取文件,文件對象.read(num),讀取文件的前num個字節,若沒有傳入num,則讀取全部
print(f.read(10))
print(f.read()) # 接著上面的f.read(10)讀
print(20 * "*")# 讀取文件,文件對象.readlines(),讀取文件每一行,封裝為列表
print(f.readlines()) # 同樣也是接著上面繼續讀,所以輸出結果是個空列表
k = open("D:/pythonlearning/example1.txt", "r", encoding="UTF-8")
print(k.readlines()) # 讀取一個全新的文件,把每一行分割,封裝為列表
print(20 * "*")# 讀取文件,文件對象.readline(),使用一次讀取一行
g = open("D:/pythonlearning/example2.txt", "r", encoding="UTF-8")
line1 =g.readline()
line2 =g.readline()
line3 =g.readline()
print(line1)
print(line2)
print(line3)
print(20 * "*")# 用for循環讀取文件行
m = open("D:/pythonlearning/example3.txt", "r", encoding="UTF-8")
for line in m:print(line)
print(20 * "*")# 關閉文件,文件對象.close()。關閉程序對文件的占用# with open語法:with open("文件路徑", "讀取方式", encoding="編碼類型") as 文件對象:,可以自動創建文件對象以及自動關閉文件
with open("D:/pythonlearning/example4.txt", "r", encoding="UTF-8") as n:for line in n:print(line)# 輸出結果
'''
<class '_io.TextIOWrapper'>
********************
1234567
ab
cdefg
8910
hijk
********************
[]
['1234567\n', 'abcdefg\n', '8910\n', 'hijk']
********************
1234567abcdefg8910********************
1234567abcdefg8910hijk
********************
1234567abcdefg8910hijk
'''
練習
exercise.txt文件如下,要求統計hello這個單詞出現的次數
hello hi hello good
if while hello yes hello hello
yes good hello
hello
hello
f = open("D:/pythonlearning/exercise.txt", "r", encoding="UTF-8")
k = 0
for line in f:my_str = line.strip("\n") # 刪除首尾可能出現的換行符my_str = my_str.strip(" ") # 刪除首尾可能出現的換行符new_list = my_str.split(" ") # 分隔,成為列表k += new_list.count("hello")
print(k)
f.close()# 輸出結果
'''
8
'''
3.文件的寫入(w模式)
- 寫入內容:文件對象.write(寫入的內容)
- 文件內容刷新:文件對象.flush()直接調用write,內容并沒有真正寫入文件,而是會積攢在程序的內存中,稱之為緩存區,這時候需要調用flush,內容才會真正寫入文件。這么做是為了避免頻繁操作硬盤,導致效率下降(攢一起,一次性寫入)
# 創建一個新的文件,并進行寫入操作
f = open("D:/pythonlearning/1.txt", "w", encoding="UTF-8") # 寫入模式“w”
f.write("hello world")
f.flush() # 刷新內容
f.close() # close函數有內置flush刷新功能,關閉的同時也對文檔進行了更新# 打開一個已經存在的文件,并進行寫入操作
g = open("D:/pythonlearning/example.txt", "w", encoding="UTF-8") # 寫入模式“w”,會把已有文件全部清空
g.write("hello world")
f.close()# example文件結果
'''
hello world
'''
4.文件的追加寫入(a模式)
# 創建一個新的文件,并進行追加寫入操作
f = open("D:/pythonlearning/2.txt", "a", encoding="UTF-8") # 追加寫入模式“a”
f.write("hello world")
f.flush() # 刷新內容
f.close() # close函數有內置flush刷新功能,關閉的同時也對文檔進行了更新# 打開一個已經存在的文件,并進行寫入操作
g = open("D:/pythonlearning/example1.txt", "a", encoding="UTF-8") # 追加寫入模式“a”,在已有內容后面繼續加內容
g.write("\nhello world")
f.close()# example1文件結果
'''
1234567
abcdefg
8910
hijk
hello world
'''
5.綜合案例
exercise1.txt文件如下:
name,date,money,type,remarks
周倫,2022-01-01100000,消費,正式
周倫,2022-01-02,300000,收入,正式
周倫,2022-01-03,100000,消費,測試
林節,2022-01-01,300000, 收入,正式
林節,2022-01-02,100000, 消費,測試
林節,2022-01-03,100000, 消費,正式
林節,2022-01-04,100000, 消費,測試
林節,2022-01-05,500000, 收入,正式
張油,2022-01-01,100000, 消費,正式
張油,2022-01-02,500000, 收入,正式
張油,2022-01-03,900000, 收入,測試
王鴻,2022-01-01,500000, 消費,正式
王鴻,2022-01-02,300000, 消費,測試
王鴻,2022-01-03,950000, 收入,正式
劉滑,2022-01-01,300000, 消費,測試
劉滑,2022-01-02,100000, 消費,正式
劉滑,2022-01-03,300000, 消費,正式
完成以下操作:
(1)讀取文件
(2)將文件寫出到new.txt文件
(3)同時,將文件內標記為測試的數據行丟棄
f = open("D:/pythonlearning/exercise1.txt", "r", encoding="UTF-8")
g = open("D:/pythonlearning/new.txt", "a", encoding="UTF-8")
for line in f:str1 = line.strip(" ")str_last = str1.strip("\n")new_list = str_last.split(",")if "正式" in new_list:g.write(str_last + "\n")
f.close()
g.close()# 輸出結果
'''
周倫,2022-01-01100000,消費,正式
周倫,2022-01-02,300000,收入,正式
林節,2022-01-01,300000, 收入,正式
林節,2022-01-03,100000, 消費,正式
林節,2022-01-05,500000, 收入,正式
張油,2022-01-01,100000, 消費,正式
張油,2022-01-02,500000, 收入,正式
王鴻,2022-01-01,500000, 消費,正式
王鴻,2022-01-03,950000, 收入,正式
劉滑,2022-01-02,100000, 消費,正式
劉滑,2022-01-03,300000, 消費,正式
'''
2-01-01,300000, 收入,正式
林節,2022-01-03,100000, 消費,正式
林節,2022-01-05,500000, 收入,正式
張油,2022-01-01,100000, 消費,正式
張油,2022-01-02,500000, 收入,正式
王鴻,2022-01-01,500000, 消費,正式
王鴻,2022-01-03,950000, 收入,正式
劉滑,2022-01-02,100000, 消費,正式
劉滑,2022-01-03,300000, 消費,正式
'''