1. 程式人生 > >決戰Python之巔(九)

決戰Python之巔(九)

前言

今天…哦不對,昨天開始了第二模組的學習,導師說很多人在這一模組掛了…嗯-。-加油吧。
模組剛開始講的是檔案操作,我在這裡小結一下。

知識回顧

三元運算

在講檔案操作之前先將一個小知識:三元運算。
三元運算又稱三目運算,是對簡單條件語句的簡寫,目的是為了讓你的程式碼看起來高大上,讓你裝…13。
例如:

if 條件成立:
	a = 2
else:
	a = 3

改成三元運算:

a = 2 if 條件成立 else 3

就這麼簡單…

檔案操作

檔案操作無非就是讀、寫、修改,首先從讀開始。

讀檔案

第一種模式

f = open(file = 'python.txt',mode = 'r',encoding='utf-8')
data = f.read()
f.close()
  • file = ‘python.txt’ 表示檔案路徑
  • mode =‘r’ 表示只讀模式(可修改)
  • encoding= 'utf-8’表示將硬碟上的10101010用utf-8的規則去‘斷句’,‘斷句’之後再將10101010轉換成unicode
  • f.read()表示讀取檔案所有內容,內容是已經轉換過的字串
  • f.close()表示關閉檔案

第二種模式

f = open(file = 'python.txt',mode = 'rb')
data = f.read()
f.close()

這裡的mode變成了‘rb’表示讀出來所有的內容,都是硬碟上儲存的,表示這個檔案內容的01010101。

這兩種模式有何區別呢?你會注意到,第二種模式沒有encoding,'rb’是指以二進位制的模式讀,資料從硬碟上讀到記憶體裡直接是bytes模式,如果你想知道確切內用而不是一堆010101,則需要你手動decode,因此在檔案開啟階段,不需要指定編碼。

第一種模式中,我們需要指定某種編碼,某種與處理檔案時用的一樣的編碼。那萬一我們不知道處理檔案用的什麼編碼怎麼辦?

import chardet
f = open('python.txt',mode = 'rb')
data = f.read()
f.close()

result = chardet.detect(open('python.txt',mode = 'rb').read())
print(result)

這裡需要呼叫到其他模組chardet。

那麼,這麼多行檔案,我不想一次性全都讀出來,我想一行一行讀出來,怎麼辦?
使用迴圈:

f = open(file = 'python.txt',mode = 'r',encoding='utf-8')
for line in f:
	print(line)
f.close()

這裡你會發現,下面一行總是另起一行開始。
Why?
因為每次print之後,後面會自動加上一個換行符。

寫檔案

寫檔案其實和讀檔案差不多,只不過是:

f = open(file = 'python.txt',mode = 'w',encoding='utf-8')
f.write("你要寫的內容")
f.close()
  • 把mode換成了w,即write
  • f.read()換成了f.write()
  • 這裡的encoding
  • 表示的是將寫入的unicode字串編碼成utf-8格式

當你事過之後你會發現,每次寫之後,之前的內容沒有了,檔案裡只有你的新內容,why?
其實這個‘寫’的流程是,先判斷這個檔案在當前路徑下存不存在,存在就清空寫入新內容,不存在就新建一個檔案並寫入內容。
同樣也有二進位制寫法,wb。

追加

即把內容追加到檔案尾部:

f = open(file = 'python.txt',mode = 'a',encoding='utf-8')
f.write("你要寫的內容")
f.close()
  • mode= ‘a’ 表示append,追加。
  • 同樣是要寫進去,所以還是f.write()
  • 切記,一定要f.close()才能看到檔案中寫入的內容。

讀寫混合模式

如果你想先把檔案內容讀出來看一下,然後再寫,那就是用讀寫混合模式:

f = open('python.txt', 'r+','utf-8')
data = f.read()
print(data)
f.write("你要寫的內容")
f.close()

其他方法

在這裡插入圖片描述
這裡直介紹部分:

  • flush:上面說過,無論是寫還是追加,一定要關閉檔案後再能看到是否寫成功,為什麼呢?因為每次寫檔案時,你需要寫入的內容其實都是先存到一個buffer即快取中,當你關閉檔案後,檔案內容才會從快取中寫到硬盤裡。這樣就有一個風險,就是說萬一有一天你在寫很重要的內容,寫著寫著,咔停電了,那快取中的東西就都沒了。那怎麼辦?穩妥一點就是邊寫邊存,一遍寫到快取中,一遍強制內容從buffer中重新整理到硬盤裡,這就是flush。
f = open(file = 'python.txt',mode = 'w',encoding='utf-8')
f.write("你要寫的內容")
f.flush() # 這裡檔案沒有關閉,你還可以繼續寫而不用重新開啟檔案
  • readable、writeable:很簡單,判斷檔案是否可讀可寫,主要是在linux中用到。
  • readline:讀檔案時只讀一行,遇到換行符停止
  • seek、tell:在講這兩個之前先說一下,其實每次開啟檔案,都有一個隱形的游標,預設位置0即在檔案內容頭,當你讀完一個檔案,再讀一次時你會發現讀出來的是空的,因為這時候游標已經移動到檔案內容最後,再往下讀什麼也沒有,所以返回空。而tell的作用就是告訴我們這個游標現在在什麼位置,seek是將游標移動到指定的位置,注意這裡的位置是按位元組算的,假如是unicode編碼,一個漢字佔兩個位元組,想移動過一個漢字,就是seek(2),不同編碼中字元佔的位元組數不一樣,seek的引數就要賦不同的值,否則會報錯或者亂碼,切記。
  • truncate:不指定引數,就去除當前游標到檔案末尾內容;指定引數,就保留從檔案頭開始,指定長度的內容,其他的全部去除。

修改

修改有兩種方法:

佔記憶體法:

這種方法是將檔案內容全部讀到記憶體裡以後,再修改,然後將修改後的內容重新寫入原檔案。

f = open('python.txt', 'r+','utf-8')
data = f.read()
print(data)
data.replace('原內容',‘新內容’)
f.write(data)
f.close()

佔硬碟法:

這種方法是將內容一行一行讀出來,修改後寫到一個新的檔案中去:

f = open('old_python.txt', 'r','utf-8')
f_new = open('new_python.txt', 'w','utf-8')
for line in f:
	if 'old_str' in line:
		line = line.replace('old_str','new_str')
	f_new.write(line)
f.new.close()
f.close()

具體效果大家一試便知。