詳解Python中的文件操作
一、文件的編碼
1.1 背景
thinking:計(jì)算機(jī)只能識(shí)別:0和1,那么我們豐富的文本文件是如何被計(jì)算機(jī)識(shí)別,并存儲(chǔ)在硬盤中呢?
answer:使用編碼技術(shù)(密碼本)將內(nèi)容翻譯成0和1存入。
編碼技術(shù)即:翻譯的規(guī)則,記錄了如何將內(nèi)容翻譯成二進(jìn)制,以及如何將二進(jìn)制翻譯回可識(shí)別內(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ī)后就會(huì)消失。要長(zhǎng)久保存數(shù)據(jù),就要使用硬盤、光盤、U 盤等設(shè)備。為了便于數(shù)據(jù)的管理和檢索,引入了“文件”的概念。
一篇文章、一段視頻、一個(gè)可執(zhí)行程序,都可以被保存為一個(gè)文件,并賦予一個(gè)文件名。操作系統(tǒng)以文件為單位管理磁盤中的數(shù)據(jù)。一般來說,文件可分為文本文件、視頻文件、音頻文件、圖像文件、可執(zhí)行文件等多種類別。
2.2 文件操作的內(nèi)容
在日常生活中,文件操作主要包括打開、關(guān)閉、讀、寫等操作。
2.3 文件的操作步驟
大概可以分為三個(gè)步驟(簡(jiǎn)稱文件操作三步走):
①打開文件
②讀寫文件
③關(guān)閉文件
注意
:可以只打開和關(guān)閉文件,不進(jìn)行任何讀寫。
2.3.1 open()打開函數(shù)
在Python,使用open函數(shù),可以打開一個(gè)已經(jīng)存在的文件,或者創(chuàng)建一個(gè)新文件,語(yǔ)法如下
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ù)直接指定
注意:此時(shí)的'f'是'open'函數(shù)的文件對(duì)象,對(duì)象是Python中一種特殊的數(shù)據(jù)類型,擁有屬性和方法,可以使用對(duì)象.屬性或?qū)ο?方法對(duì)其進(jìn)行訪問,w相當(dāng)于是覆蓋寫入。
mode常用的三種基礎(chǔ)訪問模式
2.3.2 讀操作相關(guān)方法
read()方法:
文件對(duì)象.read(num)
num表示要從文件中讀取的數(shù)據(jù)的長(zhǎng)度(單位是字節(jié)),如果沒有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)。
readlines()方法:
readlines可以按照行的方式把整個(gè)文件中的內(nèi)容進(jìn)行一次性讀取,并且返回的是一個(gè)列表,其中每一行的數(shù)據(jù)為一個(gè)元素。
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) # 每一個(gè)line臨時(shí)變量,就記錄了文件的一行數(shù)據(jù)
close():關(guān)閉文件對(duì)象
f = open('python.txt', "r") f.close() # 最后通過close,關(guān)閉文件對(duì)象,也就是關(guān)閉對(duì)文件的占用 # 如果不調(diào)用close,同時(shí)程序沒有停止運(yùn)行,那么這個(gè)文件將一直被python程序占用。
with open語(yǔ)法
with open('python.txt', 'r') as f: f.readlines() # 通過在with open的語(yǔ)句塊中對(duì)文件進(jìn)行操作 # 可以在操作完成后自動(dòng)關(guān)閉close文件,避免遺忘掉close方法
2.3.3 操作匯總
2.3.4 總結(jié)
2.3.5 課后練習(xí):?jiǎn)卧~計(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:讀取全部?jī)?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)容并為真正寫入文件,而是會(huì)積攢在程序的內(nèi)存中,稱之為緩沖區(qū)
- 當(dāng)調(diào)用flush的時(shí)候,內(nèi)容才會(huì)真正寫入文件
- 這樣做是避免頻繁地操作硬盤,導(dǎo)致效率下降(攢一堆,一次性寫入磁盤)
寫操作注意
- 文件如果不存在,使用”w”模式,會(huì)創(chuàng)建新文件
- 文件如果存在,使用”w”模式,會(huì)將原有內(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模式,文件不存在會(huì)創(chuàng)建文件
- a模式,文件存在會(huì)在最后,追加寫入文件
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),測(cè)試
林俊節(jié),2022-01-01,300000,收入,正式
林俊節(jié),2022-01-02,100000,消費(fèi),測(cè)試
林俊節(jié),2022-01-03,100000,消費(fèi),正式
林俊節(jié),2022-01-04,100000,消費(fèi),測(cè)試
林俊節(jié),2022-01-05,500000,收入,正式
張學(xué)油,2022-01-01,100000,消費(fèi),正式
張學(xué)油,2022-01-02,500000,收入,正式
張學(xué)油,2022-01-03,900000,收入,測(cè)試
王力鴻,2022-01-01,500000,消費(fèi),正式
王力鴻,2022-01-02,300000,消費(fèi),測(cè)試
王力鴻,2022-01-03,950000,收入,正式
劉德滑,2022-01-01,300000,消費(fèi),測(cè)試
劉德滑,2022-01-02,100000,消費(fèi),正式
劉德滑,2022-01-03,300000,消費(fèi),正式
要求將內(nèi)容復(fù)制并保存為 bill.txt文件
""" 演示文件操作綜合案例:文件備份 """ # 我的寫法,一開始理解有誤了,題目的要求是測(cè)試的數(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 == "測(cè)" or line == "試": # flag = False # if flag: # f_bak.write(lines) # flag = True # # # 關(guān)閉文件 # f.close() # f_bak.close() # 參考寫法 # 打開文件得到文件對(duì)象,準(zhǔn)備讀取 fr = open("bill.txt", "r", encoding="UTF-8") # 打開文件得到文件對(duì)象,準(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] == "測(cè)試": continue # 將內(nèi)容寫出去 fw.write(line) # 由于前面對(duì)內(nèi)容進(jìn)行了strip()的操作,所以要手動(dòng)的寫出換行符 fw.write("\n") # close2個(gè)文件對(duì)象 fr.close() fw.close() # 寫出文件調(diào)用close()會(huì)自動(dòng)flush()
以上就是詳解Python中的文件操作 的詳細(xì)內(nèi)容,更多關(guān)于Python文件操作 的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用 Python 讀取電子表格中的數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了使用 Python 讀取電子表格中的數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04python打包exe文件并隱藏執(zhí)行CMD命令窗口問題
這篇文章主要介紹了python打包exe文件并隱藏執(zhí)行CMD命令窗口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01使用Django開發(fā)簡(jiǎn)單接口實(shí)現(xiàn)文章增刪改查
這篇文章主要介紹了使用Django開發(fā)簡(jiǎn)單接口實(shí)現(xiàn)文章增刪改查,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05解決PyCharm不在run輸出運(yùn)行結(jié)果而不是再Console里輸出的問題
這篇文章主要介紹了解決PyCharm不在run輸出運(yùn)行結(jié)果而不是再Console里輸出的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python 比較兩個(gè)數(shù)組的元素的異同方法
下面小編就為大家?guī)硪黄狿ython 比較兩個(gè)數(shù)組的元素的異同方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08將pytorch的網(wǎng)絡(luò)等轉(zhuǎn)移到cuda
這篇文章主要介紹了將pytorch的網(wǎng)絡(luò)等轉(zhuǎn)移到cuda的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06在Python中操作字符串之startswith()方法的使用
這篇文章主要介紹了在Python中操作字符串之startswith()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05python?中?lxml?的?etree?標(biāo)簽解析
這篇文章主要介紹了python?中l(wèi)xml的etree?標(biāo)簽解析,文章圍繞主題展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助2022-04-04將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例
這篇文章主要介紹了將Python代碼嵌入C++程序進(jìn)行編寫的實(shí)例,盡管通常還是Python代碼中調(diào)用C++程序的情況較多...需要的朋友可以參考下2015-07-07