python入門教程06-02(python語法入門之文件處理)

2020-12-20 上海老男孩教育

上一章講解了python的字符編碼,了解了python的字符代碼結構之後就需要了解一下python這門語言是如何處理你給的命令,怎麼去處理文件的,下面我們來了解一二。

一 引入

應用程式運行過程中產生的數據最先都是存放於內存中的,若想永久保存下來,必須要保存於硬碟中。應用程式若想操作硬體必須通過作業系統,而文件就是作業系統提供給應用程式來操作硬碟的虛擬概念,用戶或應用程式對文件的操作,就是向作業系統發起調用,然後由作業系統完成對硬碟的具體操作。

二 文件操作的基本流程

2.1 基本流程

有了文件的概念,我們無需再去考慮操作硬碟的細節,只需要關注操作文件的流程:

# 1. 打開文件,由應用程式向作業系統發起系統調用open(...),作業系統打開該文件,對應一塊硬碟空間,並返回一個文件對象賦值給一個變量ff=open('a.txt','r',encoding='utf-8') #默認打開模式就為r# 2. 調用文件對象下的讀/寫方法,會被作業系統轉換為讀/寫硬碟的操作data=f.read()# 3. 向作業系統發起關閉文件的請求,回收系統資源f.close()

2.2 資源回收與with上下文管理

打開一個文件包含兩部分資源:應用程式的變量f和作業系統打開的文件。在操作完畢一個文件時,必須把與該文件的這兩部分資源全部回收,回收方法為:

1、f.close() #回收作業系統打開的文件資源2、del f #回收應用程式級的變量

其中del f一定要發生在f.close()之後,否則就會導致作業系統打開的文件無法關閉,白白佔用資源,

而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢文件後,一定要記住f.close(),雖然我們如此強調,但是大多數讀者還是會不由自主地忘記f.close(),考慮到這一點,python提供了with關鍵字來幫我們管理上下文

# 1、在執行完子代碼塊後,with 會自動執行f.close()with open('a.txt','w') as f:

pass # 2、可用用with同時打開多個文件,用逗號分隔開即可with open('a.txt','r') as read_f,open('b.txt','w') as write_f:

data = read_f.read()

write_f.write(data)

2.3 指定操作文本文件的字符編碼

f = open(...)是由作業系統打開文件,如果打開的是文本文件,會涉及到字符編碼問題,如果沒有為open指定編碼,那麼打開文本文件的默認編碼很明顯是作業系統說了算了,作業系統會用自己的默認編碼去打開文件,在windows下是gbk,在linux下是utf-8。

這就用到了上節課講的字符編碼的知識:若要保證不亂碼,文件以什麼方式存的,就要以什麼方式打開。

f = open('a.txt','r',encoding='utf-8')

三 文件的操作模式

3.1 控制文件讀寫操作的模式

r(默認的):只讀

w:只寫

a:只追加寫

3.1.1 案例一:r 模式的使用

# r只讀模式: 在文件不存在時則報錯,文件存在文件內指針直接跳到文件開頭 with open('a.txt',mode='r',encoding='utf-8') as f:

res=f.read() # 會將文件的內容由硬碟全部讀入內存,賦值給res# 小練習:實現用戶認證功能 inp_name=input('請輸入你的名字: ').strip()

inp_pwd=input('請輸入你的密碼: ').strip()

with open(r'db.txt',mode='r',encoding='utf-8') as f:

for line in f:

# 把用戶輸入的名字與密碼與讀出內容做比對 u,p=line.strip('\n').split(':')

if inp_name == u and inp_pwd == p:

print('登錄成功')

break else:

print('帳號名或者密碼錯誤')

3.1.2 案例二:w 模式的使用

# w只寫模式: 在文件不存在時會創建空文檔,文件存在會清空文件,文件指針跑到文件開頭with open('b.txt',mode='w',encoding='utf-8') as f:

f.write('你好\n')

f.write('我好\n')

f.write('大家好\n')

f.write('111\n222\n333\n')#強調:# 1 在文件不關閉的情況下,連續的寫入,後寫的內容一定跟在前寫內容的後面# 2 如果重新以w模式打開文件,則會清空文件內容

3.1.3 案例三:a 模式的使用

# a只追加寫模式: 在文件不存在時會創建空文檔,文件存在會將文件指針直接移動到文件末尾 with open('c.txt',mode='a',encoding='utf-8') as f:

f.write('44444\n')

f.write('55555\n')#強調 w 模式與 a 模式的異同:# 1 相同點:在打開的文件不關閉的情況下,連續的寫入,新寫的內容總會跟在前寫的內容之後# 2 不同點:以 a 模式重新打開文件,不會清空原文件內容,會將文件指針直接移動到文件末尾,新寫的內容永遠寫在最後# 小練習:實現註冊功能: name=input('username>>>: ').strip()

pwd=input('password>>>: ').strip()

with open('db1.txt',mode='a',encoding='utf-8') as f:

info='%s:%s\n' %(name,pwd)

f.write(info)

3.1.4 案例四:+ 模式的使用(了解)

# r+ w+ a+ :可讀可寫#在平時工作中,我們只單純使用r/w/a,要麼只讀,要麼只寫,一般不用可讀可寫的模式

3.2 控制文件讀寫內容的模式

大前提: tb模式均不能單獨使用,必須與r/w/a之一結合使用

t(默認的):文本模式

1. 讀寫文件都是以字符串為單位的

2. 只能針對文本文件

3. 必須指定encoding參數

b:二進位模式:

1.讀寫文件都是以bytes/二進位為單位的

2. 可以針對所有文件

3. 一定不能指定encoding參數

3.2.1 案例一:t 模式的使用

# t 模式:如果我們指定的文件打開模式為r/w/a,其實默認就是rt/wt/at with open('a.txt',mode='rt',encoding='utf-8') as f:

res=f.read()

print(type(res)) # 輸出結果為:<class 'str'>

with open('a.txt',mode='wt',encoding='utf-8') as f:

s='abc' f.write(s) # 寫入的也必須是字符串類型

#強調:t 模式只能用於操作文本文件,無論讀寫,都應該以字符串為單位,而存取硬碟本質都是二進位的形式,當指定 t 模式時,內部幫我們做了編碼與解碼

3.2.2 案例二: b 模式的使用

# b: 讀寫都是以二進位位單位 with open('1.mp4',mode='rb') as f:

data=f.read()

print(type(data)) # 輸出結果為:<class 'bytes'> with open('a.txt',mode='wb') as f:

msg="你好" res=msg.encode('utf-8') # res為bytes類型 f.write(res) # 在b模式下寫入文件的只能是bytes類型#強調:b模式對比t模式1、在操作純文本文件方面t模式幫我們省去了編碼與解碼的環節,b模式則需要手動編碼與解碼,所以此時t模式更為方便2、針對非文本文件(如圖片、視頻、音頻等)只能使用b模式# 小練習: 編寫拷貝工具src_file=input('源文件路徑: ').strip()

dst_file=input('目標文件路徑: ').strip()with open(r'%s' %src_file,mode='rb') as read_f,open(r'%s' %dst_file,mode='wb') as write_f:

for line in read_f:

# print(line) write_f.write(line)

四 操作文件的方法

4.1 重點

# 讀操作f.read() # 讀取所有內容,執行完該操作後,文件指針會移動到文件末尾f.readline() # 讀取一行內容,光標移動到第二行首部f.readlines() # 讀取每一行內容,存放於列表中# 強調:# f.read()與f.readlines()都是將內容一次性讀入內容,如果內容過大會導致內存溢出,若還想將內容全讀入內存,則必須分多次讀入,有兩種實現方式:# 方式一with open('a.txt',mode='rt',encoding='utf-8') as f:

for line in f:

print(line) # 同一時刻只讀入一行內容到內存中# 方式二with open('1.mp4',mode='rb') as f:

while True:

data=f.read(1024) # 同一時刻只讀入1024個Bytes到內存中 if len(data) == 0:

break print(data)

# 寫操作f.write('1111\n222\n') # 針對文本模式的寫,需要自己寫換行符f.write('1111\n222\n'.encode('utf-8')) # 針對b模式的寫,需要自己寫換行符f.writelines(['333\n','444\n']) # 文件模式f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

4.2 了解

f.readable() # 文件是否可讀f.writable() # 文件是否可讀f.closed # 文件是否關閉f.encoding # 如果文件打開模式為b,則沒有該屬性f.flush() # 立刻將文件內容從內存刷到硬碟f.name

五 主動控制文件內指針移動

#大前提:文件內指針的移動都是Bytes為單位的,唯一例外的是t模式下的read(n),n以字符為單位with open('a.txt',mode='rt',encoding='utf-8') as f:

data=f.read(3) # 讀取3個字符 with open('a.txt',mode='rb') as f:

data=f.read(3) # 讀取3個Bytes# 之前文件內指針的移動都是由讀/寫操作而被動觸發的,若想讀取文件某一特定位置的數據,則則需要用f.seek方法主動控制文件內指針的移動,詳細用法如下:# f.seek(指針移動的字節數,模式控制): # 模式控制:# 0: 默認的模式,該模式代表指針移動的字節數是以文件開頭為參照的# 1: 該模式代表指針移動的字節數是以當前所在的位置為參照的# 2: 該模式代表指針移動的字節數是以文件末尾的位置為參照的# 強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

5.1 案例一: 0模式詳解

# a.txt用utf-8編碼,內容如下(abc各佔1個字節,中文「你好」各佔3個字節)abc你好# 0模式的使用with open('a.txt',mode='rt',encoding='utf-8') as f:

f.seek(3,0) # 參照文件開頭移動了3個字節 print(f.tell()) # 查看當前文件指針距離文件開頭的位置,輸出結果為3 print(f.read()) # 從第3個字節的位置讀到文件末尾,輸出結果為:你好 # 注意:由於在t模式下,會將讀取的內容自動解碼,所以必須保證讀取的內容是一個完整中文數據,否則解碼失敗with open('a.txt',mode='rb') as f:

f.seek(6,0)

print(f.read().decode('utf-8')) #輸出結果為: 好

5.2 案例二: 1模式詳解

# 1模式的使用with open('a.txt',mode='rb') as f:

f.seek(3,1) # 從當前位置往後移動3個字節,而此時的當前位置就是文件開頭 print(f.tell()) # 輸出結果為:3 f.seek(4,1) # 從當前位置往後移動4個字節,而此時的當前位置為3 print(f.tell()) # 輸出結果為:7

5.3 案例三: 2模式詳解

# a.txt用utf-8編碼,內容如下(abc各佔1個字節,中文「你好」各佔3個字節)abc你好# 2模式的使用with open('a.txt',mode='rb') as f:

f.seek(0,2) # 參照文件末尾移動0個字節, 即直接跳到文件末尾 print(f.tell()) # 輸出結果為:9 f.seek(-3,2) # 參照文件末尾往前移動了3個字節 print(f.read().decode('utf-8')) # 輸出結果為:好# 小練習:實現動態查看最新一條日誌的效果import timewith open('access.log',mode='rb') as f:

f.seek(0,2)

while True:

line=f.readline()

if len(line) == 0:

# 沒有內容 time.sleep(0.5)

else:

print(line.decode('utf-8'),end='')

六 文件的修改

# 文件a.txt內容如下張一蛋 山東 179 49 12344234523李二蛋 河北 163 57 13913453521王全蛋 山西 153 62 18651433422# 執行操作with open('a.txt',mode='r+t',encoding='utf-8') as f:

f.seek(9)

f.write('<婦女主任>')

# 文件修改後的內容如下張一蛋<婦女主任> 179 49 12344234523李二蛋 河北 163 57 13913453521王全蛋 山西 153 62 18651433422# 強調:# 1、硬碟空間是無法修改的,硬碟中數據的更新都是用新內容覆蓋舊內容# 2、內存中的數據是可以修改的

文件對應的是硬碟空間,硬碟不能修改對應著文件本質也不能修改,

那我們看到文件的內容可以修改,是如何實現的呢?

大致的思路是將硬碟中文件內容讀入內存,然後在內存中修改完畢後再覆蓋回硬碟

具體的實現方式分為兩種:

6.1 文件修改方式一

# 實現思路:將文件內容發一次性全部讀入內存,然後在內存中修改完畢後再覆蓋寫回原文件# 優點: 在文件修改過程中同一份數據只有一份# 缺點: 會過多地佔用內存with open('db.txt',mode='rt',encoding='utf-8') as f:

data=f.read()with open('db.txt',mode='wt',encoding='utf-8') as f:

f.write(data.replace('kevin','SB'))

6.1 文件修改方式二

# 實現思路:以讀的方式打開原文件,以寫的方式打開一個臨時文件,一行行讀取原文件內容,修改完後寫入臨時文件...,刪掉原文件,將臨時文件重命名原文件名# 優點: 不會佔用過多的內存# 缺點: 在文件修改過程中同一份數據存了兩份import oswith open('db.txt',mode='rt',encoding='utf-8') as read_f,\

open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:

for line in read_f:

wrife_f.write(line.replace('SB','kevin'))

os.remove('db.txt')

os.rename('.db.txt.swap','db.txt')

相關焦點

  • 書聲琅琅:好的Python入門教程
    好的Python入門教程,書聲琅琅教育番茄老師微信pykf20介紹,python語言現在應用非常廣泛,不管是大數據還是人工智慧,應用最多的語言還是python,因此對於許多小白來講,看到python從業者的高薪資,想要轉行,或者致力於python開發的朋友,如果要學習python,從零基礎開始,一定需要一套完整的學習路線。
  • python入門教程06-01(python語法入門之字符編碼)
    階段2、python解釋器相當於文本編輯器,從硬碟上將test.py的內容讀入到內存中#階段3、python解釋器解釋執行剛剛讀入的內存的內容,開始識別python語法2.4 總結python解釋器與文件本編輯的異同如下#1、相同點:前兩個階段二者完全一致,都是將硬碟中文件的內容讀入內存,詳解如下python解釋器是解釋執行文件內容的,因而python解釋器具備讀
  • python教程
    開發知識體系序號教程名稱400301-Python快速入門連結: 400402-Python初級課程連結:400503- Python 定向爬蟲入門400604-Linux從入門到精通400705-Linux從入門到精通400806-Python資料庫操作400907-Apache
  • python如何快速入門
    昨天有同學私信我,說看了機器學習的東西,但是不懂python,也不知道怎麼入門,打算介紹一下思路給同學參考一下。首先,要連接python是什麼?可以做什麼?目前有什麼場景?目前,puthon主要有機器學習,數據處理,爬蟲,圖像處理,工業控制,文本處理,工具開發等,確定好方向後就開始學習。小編建議往機器學習發展,可以參考我的文章
  • 十六本python入門學習書籍推薦,python入門新手必看
    隨著人工智慧時代的到來,python程式語言一步登天衝到編程排行榜第一名,因此更多朋友想轉行學習python程式語言的朋友,可以一起看一下:python入門新手必看的十六本python入門學習書籍1、python基礎教程司維所著圖書:本書包括Python程序設計的方方面面,首先從Python
  • Python 從零開始--入門篇
    why pthon為什麼是 python 呢,原因很簡單~嗯哼!就是很簡答相比於 C語言 的指針的混亂,和 Java 的繁瑣,python 更加適合作為非計算機專業的第一個入門的程式語言。(計算機專業最好還是以C語言為第一門語言入門為好,後面寫文章出來介紹)從語法上面來說也擁有更多的第三方庫,避免了很多「重複製造輪子「。能夠很快上手,很多系統也都內置了python環境,相關配置也很簡單。當然除了這些拿來吃飯也是很重要的,時代所需,生活所迫。
  • 如何入門Python之Python基礎教程詳解
    隨著人工智慧的發展,Python近兩年也是大火,越來越多的人加入到Python學習大軍,對於毫無基礎的人該如何入門Python呢?這裡整理了一些個人經驗和Python入門教程供大家參考。如果你是零基礎入門 Python 的話,建議初學者至少達到兩個目標: 會用,理解。
  • 學python?不是一個python入門教程就行,學之前你必須知道這些
    既然是就業那麼就要看市場,就是人才需求市場,這裡說的市場當讓是說python人才需求的市場了。說到市場當然python每個方向肯定有市場了,咱們直接看主要矛盾:一個是需求量,另一個是入行的難易程度。python全棧目前是市場的需求量最大,入行也是最容易的。要是為了就業那就先這樣入門入行,就不用想了。
  • Python快速入門的方法
    那麼,作為一個新手,如何才能快速並有效的入門呢?0.快速入門《和孩子一起學編程》這本書說是給兒童設計的,所以內容比較生動。非常非常非常簡單易懂 不用花太長時間就能看下來一遍。import一個easygui,初學者分分鐘做個圖形界面出來,對於初學python,成就感!!
  • 入門Python, 看這些資料就夠了
    最後,平時有空可以看看awesome-python-cn和python-tip上的內容,作為入門之外的擴展,開闊自己的視野【實驗樓Python3教程】連結:Python3 簡明教程 (https://www.shiyanlou.com/courses/596)簡介: 提供了開箱即用的實驗環境 ,省去了搭建環境的麻煩。 偏重實戰。
  • Python 圖像處理 OpenCV (1):入門
    引言又開一個新的系列分享,對圖像處理感興趣的同學可以關注這個系列。更新頻率儘量保持一周兩到三次推送。
  • Python數據處理庫pandas入門教程
    本文是對它的一個入門教程。pandas提供了快速,靈活和富有表現力的數據結構,目的是使「關係」或「標記」數據的工作既簡單又直觀。它旨在成為在Python中進行實際數據分析的高級構建塊。讀取CSV文件下面,我們再來看讀取CSV文件的例子。第一個CSV文件內容如下:嚴格的來說,這並不是一個CSV文件了,因為它的數據並不是通過逗號分隔的。
  • Linux下python入門之基本語法3
    前言前面兩篇文章我和大家一起學習了python入門的一些基本語法:注釋、空行、多行連字符、標識符、列印和行縮進的基本用法。今天我們再介紹幾種常用的語法:print的進階用法、等待用戶輸入、同一行顯示多條語句和多語句代碼組的用法。python使用基本語法1.print使用方法進階在前面的文章中,我們學習了print具有類似echo的功能,可以列印輸出。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。 因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07
  • 一個入門級python爬蟲教程詳解
    這篇文章主要介紹了一個入門級python爬蟲教程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑑價值,需要的朋友可以參考下
  • Python入門個人經驗之文本編譯器(IDLE、Anaconda、Pycharm)
    入門使用的教材是《Python編程從入門到實踐》,開始使用的版本是直接在官網下載Python3.7.0版本,使用的文本編譯器是自帶的IDLE。在跟著教材學習前面的基礎知識時,由於涉及到的自己安裝的庫不多(只在csdn社區某大佬提供的資源處下載了numpy庫),IDLE也是足夠使用的。
  • 菜鳥學Python入門教程大盤點|7個多月的心血總結
    一張圖搞定-Python文件常用的場景和用法"2)."深入解析Python模塊引入機制"3)."Python裡的黃金庫,學會了你的工資至少翻一倍"8.Python裡的文件處理Python的文件處理是我學過這麼多語言裡面最簡單,易用的,無論是c,c++,java,perl都沒有Python這麼簡單,而且還有神一樣的with用法,簡直就是懶人專用,用起來簡單上手很快,而且功能還非常強大.
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • 史丹福大學教授推薦兩本Python入門書籍
    今天給大家分享自己學習的python的入門書籍。曾經我們讀書的時候,對編程能力特別感興趣,可是我本身發展不是學計算機的,所以進行編程技術只能看視頻通過自學。在後來偶然因素之間相互接觸了解到python這門專業語言,給我打開了一扇新的大門。因為python實在太簡單了,直接在命令行打」1+1「,回車就出來結果了,交互性也是非常強。而且python有大量研究第三方的庫,我要科學理論計算就要用到,雖然我不知道代碼管理內部環境怎麼編寫的,我只要給這些參數就能不斷得到提高實驗分析結果。對於我這種編程小白來說解決問題是最重要的。
  • 「小白福利,快速入門Python」之處理文件
    歡迎關注公眾號【哈希大數據】python實例 合併文件並去重運行結果:"D:\anaconda python\python3.6.exe>去重操作完成Process finished with exit code 0一、python介紹 對文件的操作我們已知程序是無法直接讀寫磁碟中的文件,而是請求作業系統提供數據操作接口,為我們生成一個文件對象,從而獲取或寫入需要的數據。