詳解Python中的文件操作
一、文件的編碼
1.1 背景
thinking:計(jì)算機(jī)只能識別:0和1,那么我們豐富的文本文件是如何被計(jì)算機(jī)識別,并存儲在硬盤中呢?
answer:使用編碼技術(shù)(密碼本)將內(nèi)容翻譯成0和1存入。
編碼技術(shù)即:翻譯的規(guī)則,記錄了如何將內(nèi)容翻譯成二進(jìn)制,以及如何將二進(jìn)制翻譯回可識別內(nèi)容。
計(jì)算機(jī)中有許多可用編碼:
- UTF-8
- GBK
- Big5
- ...
不同的編碼,將內(nèi)容翻譯成二進(jìn)制也是不同的。
UTF-8是目前全球通用的編碼格式。除非有特殊需求,否則,一律以UTF-8格式進(jìn)行文件編碼即可。
1.2 總結(jié)

二、文件的讀取
2.1 什么是文件
內(nèi)存中存放的數(shù)據(jù)在計(jì)算機(jī)關(guān)機(jī)后就會消失。要長久保存數(shù)據(jù),就要使用硬盤、光盤、U 盤等設(shè)備。為了便于數(shù)據(jù)的管理和檢索,引入了“文件”的概念。
一篇文章、一段視頻、一個可執(zhí)行程序,都可以被保存為一個文件,并賦予一個文件名。操作系統(tǒng)以文件為單位管理磁盤中的數(shù)據(jù)。一般來說,文件可分為文本文件、視頻文件、音頻文件、圖像文件、可執(zhí)行文件等多種類別。
2.2 文件操作的內(nèi)容
在日常生活中,文件操作主要包括打開、關(guān)閉、讀、寫等操作。
2.3 文件的操作步驟
大概可以分為三個步驟(簡稱文件操作三步走):
①打開文件
②讀寫文件
③關(guān)閉文件
注意:可以只打開和關(guān)閉文件,不進(jìn)行任何讀寫。
2.3.1 open()打開函數(shù)
在Python,使用open函數(shù),可以打開一個已經(jīng)存在的文件,或者創(chuàng)建一個新文件,語法如下
open(name, mode, encoding)
- name:是要打開的目標(biāo)文件名的字符串(可以包含文件所在的具體路徑)。
- mode:設(shè)置打開文件的模式(訪問模式):只讀、寫入、追加等。
- encoding:編碼格式(推薦使用UTF-8)
實(shí)例代碼:
f = open('python.txt', 'r', encoding='UTF-8')
# encoding的順序不是第三位,所以不能用位置參數(shù),用關(guān)鍵字參數(shù)直接指定注意:此時的'f'是'open'函數(shù)的文件對象,對象是Python中一種特殊的數(shù)據(jù)類型,擁有屬性和方法,可以使用對象.屬性或?qū)ο?方法對其進(jìn)行訪問,w相當(dāng)于是覆蓋寫入。
mode常用的三種基礎(chǔ)訪問模式

2.3.2 讀操作相關(guān)方法
read()方法:
文件對象.read(num)
num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié)),如果沒有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)。
readlines()方法:
readlines可以按照行的方式把整個文件中的內(nèi)容進(jìn)行一次性讀取,并且返回的是一個列表,其中每一行的數(shù)據(jù)為一個元素。
f = open('python.txt')
content = f.readlines()
# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)
# 關(guān)閉文件
f.close()readline()方法,一次讀取一行內(nèi)容
f = open('python.txt')
content = f.readline()
print(f'第一行{content}')
content = f.readline()
print(f'第二行{content}')
# 關(guān)閉文件
f.close()for循環(huán)讀取文件行
for line in open('python.txt', "r"):
print(line)
# 每一個line臨時變量,就記錄了文件的一行數(shù)據(jù)close():關(guān)閉文件對象
f = open('python.txt', "r")
f.close()
# 最后通過close,關(guān)閉文件對象,也就是關(guān)閉對文件的占用
# 如果不調(diào)用close,同時程序沒有停止運(yùn)行,那么這個文件將一直被python程序占用。with open語法
with open('python.txt', 'r') as f:
f.readlines()
# 通過在with open的語句塊中對文件進(jìn)行操作
# 可以在操作完成后自動關(guān)閉close文件,避免遺忘掉close方法2.3.3 操作匯總

2.3.4 總結(jié)

2.3.5 課后練習(xí):單詞計(jì)數(shù)

# 通過文件讀取操作,讀取文件word.txt,統(tǒng)計(jì)itheima單詞出現(xiàn)的次數(shù)
# 打開文件,以讀取模式打開
# 我的思路
# with open("word.txt") as f:
# contents = f.readlines()
# count = 0
# print(contents)
# for content in contents:
# content.split(" ")
# if content.count("itheima"):
# count += 1
# print(f"itheima出現(xiàn)了{(lán)count}次")
# 參考其他方法
f = open("word.txt", "r", encoding="UTF-8")
# 方式2:讀取全部內(nèi)容,通過字符串count統(tǒng)計(jì)itheima單詞數(shù)量
# content = f.read()
# count = content.count("itheima")
# print(f"itheima在文件中出現(xiàn)了:{count}次")
# 方式三:讀取內(nèi)容,一行一行讀取
count = 0 # 使用count變量來累計(jì)itheima出現(xiàn)的次數(shù)
for line in f:
line = line.strip() # 去除開頭和結(jié)尾的空格以及換行符
words = line.split(" ")
for word in words:
if word == "itheima":
count += 1 # 如果單詞是itheima,進(jìn)行數(shù)量的累加加1
# 判斷單詞出現(xiàn)次數(shù)并累計(jì)
print(f"itheima出現(xiàn)的次數(shù)是:{count}")
# 關(guān)閉文件
f.close()三、文件的寫入
3.1 案例演示
# f.write("Hello world1111!") # 內(nèi)容寫到內(nèi)存中
# flush刷新
# f.flush() # 將內(nèi)存中積攢的內(nèi)容,寫入到硬盤
# close關(guān)閉
# f.close() # close方法,內(nèi)置了flush的功能的
f = open("test.txt", "w", encoding="UTF-8")
# write寫入、flush刷新
f.write("小鮑學(xué)python")
# close關(guān)閉
f.close()注意:
- 直接調(diào)用write,內(nèi)容并為真正寫入文件,而是會積攢在程序的內(nèi)存中,稱之為緩沖區(qū)
- 當(dāng)調(diào)用flush的時候,內(nèi)容才會真正寫入文件
- 這樣做是避免頻繁地操作硬盤,導(dǎo)致效率下降(攢一堆,一次性寫入磁盤)
寫操作注意
- 文件如果不存在,使用”w”模式,會創(chuàng)建新文件
- 文件如果存在,使用”w”模式,會將原有內(nèi)容清空
3.2 總結(jié)

四、文件的追加
4.1 追加寫入操作快速入門
"""
演示文件的追加寫入
"""
# 打開文件,不存在的文件
# f = open("test1.txt", "a", encoding="UTF-8")
# # write寫入
# f.write("小鮑學(xué)python")
# # flush刷新
# f.flush()
# # close關(guān)閉文件
# f.close()
f = open("test1.txt", "a", encoding="UTF-8")
# write寫入,flush刷新
f.write("\n月薪過萬")
# close()關(guān)閉
f.close()注意:
- a模式,文件不存在會創(chuàng)建文件
- a模式,文件存在會在最后,追加寫入文件
4.2 追加操作總結(jié)

五、文件操作綜合案例
5.1 完成文件備份案例
需求分析
需求:有一份賬單文件,記錄了消費(fèi)收入的具體記錄,內(nèi)容如下:
name,date,money,type,remarks
周杰輪,2022-01-01,100000,消費(fèi),正式
周杰輪,2022-01-02,300000,收入,正式
周杰輪,2022-01-03,100000,消費(fèi),測試
林俊節(jié),2022-01-01,300000,收入,正式
林俊節(jié),2022-01-02,100000,消費(fèi),測試
林俊節(jié),2022-01-03,100000,消費(fèi),正式
林俊節(jié),2022-01-04,100000,消費(fèi),測試
林俊節(jié),2022-01-05,500000,收入,正式
張學(xué)油,2022-01-01,100000,消費(fèi),正式
張學(xué)油,2022-01-02,500000,收入,正式
張學(xué)油,2022-01-03,900000,收入,測試
王力鴻,2022-01-01,500000,消費(fèi),正式
王力鴻,2022-01-02,300000,消費(fèi),測試
王力鴻,2022-01-03,950000,收入,正式
劉德滑,2022-01-01,300000,消費(fèi),測試
劉德滑,2022-01-02,100000,消費(fèi),正式
劉德滑,2022-01-03,300000,消費(fèi),正式
要求將內(nèi)容復(fù)制并保存為 bill.txt文件

"""
演示文件操作綜合案例:文件備份
"""
# 我的寫法,一開始理解有誤了,題目的要求是測試的數(shù)據(jù)不需要備份到bak文件
# 讀取文件
# f = open("bill.txt", "r", encoding="UTF-8")
# # 將文件寫出到bill.txt.bak文件作為備份
# f_bak = open("bill.txt.bak", "w", encoding="UTF-8")
# flag = True
# for lines in f:
# for line in lines:
# if line == "測" or line == "試":
# flag = False
# if flag:
# f_bak.write(lines)
# flag = True
#
# # 關(guān)閉文件
# f.close()
# f_bak.close()
# 參考寫法
# 打開文件得到文件對象,準(zhǔn)備讀取
fr = open("bill.txt", "r", encoding="UTF-8")
# 打開文件得到文件對象,準(zhǔn)備寫入
fw = open("bill.txt.bak", "w", encoding="UTF-8")
# for循環(huán)讀取文件
for line in fr:
line = line.strip()
# 判斷內(nèi)容,將滿足的內(nèi)容寫出
if line.split(",")[4] == "測試":
continue
# 將內(nèi)容寫出去
fw.write(line)
# 由于前面對內(nèi)容進(jìn)行了strip()的操作,所以要手動的寫出換行符
fw.write("\n")
# close2個文件對象
fr.close()
fw.close() # 寫出文件調(diào)用close()會自動flush()以上就是詳解Python中的文件操作 的詳細(xì)內(nèi)容,更多關(guān)于Python文件操作 的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用 Python 讀取電子表格中的數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了使用 Python 讀取電子表格中的數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
python打包exe文件并隱藏執(zhí)行CMD命令窗口問題
這篇文章主要介紹了python打包exe文件并隱藏執(zhí)行CMD命令窗口問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
使用Django開發(fā)簡單接口實(shí)現(xiàn)文章增刪改查
這篇文章主要介紹了使用Django開發(fā)簡單接口實(shí)現(xiàn)文章增刪改查,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
解決PyCharm不在run輸出運(yùn)行結(jié)果而不是再Console里輸出的問題
這篇文章主要介紹了解決PyCharm不在run輸出運(yùn)行結(jié)果而不是再Console里輸出的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
將pytorch的網(wǎng)絡(luò)等轉(zhuǎn)移到cuda
這篇文章主要介紹了將pytorch的網(wǎng)絡(luò)等轉(zhuǎn)移到cuda的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
在Python中操作字符串之startswith()方法的使用
這篇文章主要介紹了在Python中操作字符串之startswith()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
python?中?lxml?的?etree?標(biāo)簽解析
這篇文章主要介紹了python?中l(wèi)xml的etree?標(biāo)簽解析,文章圍繞主題展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)或工作有所幫助2022-04-04
將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例
這篇文章主要介紹了將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例,盡管通常還是Python代碼中調(diào)用C++程序的情況較多...需要的朋友可以參考下2015-07-07

