Python之文件操作

文件

什么是文件

  • 文件是數(shù)據(jù)存儲的單位
  • 文件通常用來長期存儲數(shù)據(jù)
  • 文件中的數(shù)據(jù)是以字節(jié)為單位進行順序存儲的

文件的操作流程

  • 打開文件
  • 讀寫文件
  • 關(guān)閉文件

任何的操作系統(tǒng),一個應(yīng)用程序同時打開文件的數(shù)量有最大數(shù)限制

文本文件操作

文件操作方法

  • open(file, mode='rt') 用于打開一個文件,返回此文件對應(yīng)的文件流對象,如果打開失敗,則會觸發(fā)OSError錯誤
    • file 要打開文件的路徑
    • mode 文件打開模式
  • file.close() 關(guān)閉文件,釋放系統(tǒng)資源
  • file.readline() 讀取一行數(shù)據(jù), 如果到達文件尾則返回空行
  • file.readlines(max_chars=-1) 返回每行字符串的列表,max_chars為最大字符(或字節(jié))數(shù)
  • file.read(size = -1) 從一個文件流中最多讀取size個字符
  • file.writelines(lines) 每行字符串的列表,參數(shù)是由字符串組成的序列
  • file.write(text) 寫一個字符串到文件流中躲株,返回寫入的字符數(shù)脓斩,接收字符串參數(shù)凄鼻,適用于一次性將全部內(nèi)容寫入文件
  • file.flush() 把寫入文件對象的緩存內(nèi)容寫入到磁盤

總結(jié)

  • write()接收字符串參數(shù)传睹,適用于一次性將全部內(nèi)容寫入文件;而writelines()接收參數(shù)是由字符串組成的序列桐臊,適用于將列表內(nèi)容逐行寫入文件
  • readline()比較不優(yōu)雅;read()適合讀取內(nèi)容較少的情況,或者是需要一次性處理全部內(nèi)容的情況;而readlines()用的較多婆廊,比較靈活饼疙,因為for循環(huán)是一種迭代器溺森,每次加載部分內(nèi)容,既減少內(nèi)存壓力窑眯,又方便逐行對數(shù)據(jù)處理
try:
    f = open('./info.txt')
    print('文件打開成功')
    f.close()
    print('文件已關(guān)閉屏积!')
except OSError:
    print('文件打開失敗!')

文件打開模式

  • r 以只讀模式打開(缺省模式,必須保證文件存在)
  • w 以只寫模式打開磅甩。若文件存在,則刪除原有文件內(nèi)容;若不存在,則新建
  • a 以追加模式打開炊林。若文件存在,則會追加到文件的末尾;若文件不存在,則新建
  • x 創(chuàng)建一個新文件, 并以寫模式打開這個文件,如果文件存在則會產(chǎn)生FileExistsError錯誤
  • b 用二進制模式打開
  • t 文本文件模式打開 (默認)

常見模式組合

  • r'或'rt 默認模式,文本讀模式
  • w'或'wt 以文本寫模式打開(打開前文件被清空)
  • rb 以二進制讀模式打開
  • ab 以二進制追加模式打開
  • wb 以二進制寫模式打開(打開前文件被清空)
  • r+ 以文本讀寫模式打開卷要,默認寫的指針開始指在文件開頭, 因此會覆寫文件
  • w+ 以文本讀寫模式打開(打開前文件被清空)
  • a+ 以文本讀寫模式打開(只能寫在文件末尾)
  • rb+ 以二進制讀寫模式打開
  • wb+ 以二進制讀寫模式打開(打開前被清空)
  • ab+ 以二進制讀寫模式打開
  • w+b 可以實現(xiàn)二進制隨機讀寫渣聚,當打開文件時,文件內(nèi)容將被清零
  • r+b 以二進制讀和更新模式打開文件,打開文件時不會清空文件內(nèi)容

文本文件的操作

默認文件中存儲的都為字符數(shù)據(jù),以行為單位進行分隔,在python內(nèi)部統(tǒng)一用\n作為換行進行分隔,對文本文件讀寫需要用字符串(str)進行數(shù)據(jù)讀取和寫入

各種操作系統(tǒng)的換行符

  • Linux換行符 : \n
  • Window換行符 : \r\n
  • 舊的Macintosh換行符: \r
  • 新的Mac Os 換行符 : \n

文本文件的迭代讀取

open() 函數(shù)返回來的文件流對象是可迭代對象

f = open('abc.txt')
# 每次取出一行,相當于line = f.readline()
for line in f:
  print(line)
f.close()

標準輸入輸出文件

模塊名: sys

  • sys.stdin (默認為標準鍵盤輸入設(shè)備)
    ctrl + d 輸入文件末尾標識
  • sys.stdout (默認為屏幕終端)
  • sys.stderr (默認為屏幕終端)

二進制文件操作

對于二進制文件的讀寫通常需要用字節(jié)串(bytes)進行操作

  • F.tell() 返回當前文件流的絕對位置
  • F.seek(offset, whence=0) 改變數(shù)據(jù)流的位置,返回新的絕對位置
    • offset 偏移量
      大于0代表向文件末尾方向移動
      小于0代表向文件頭方向移動
    • whenc 相對位置
      0 代表人文件頭開始
      1 代表從當前讀寫位置開始偏移
      2 代表從文件尾開始偏移
  • F.readable() 判斷這個文件是否可讀,可讀返回True,否則返回False
  • F.writable() 判斷這個文件是否可寫,可寫返回True,否則返回False
  • F.seekable() 返回這個文件對象是否支持隨機定位
  • F.truncate(pos = None) 剪掉自pos位置之后的數(shù)據(jù),返回新的文件長度(字節(jié)為單位)

漢字編碼

# 十個漢字占多少個字節(jié)
#   GBK占20個字節(jié)  , UTF-8 占 30個字節(jié)

國標系列

  • GB18030 二字節(jié)或四字節(jié)編碼
  • GBK 二字節(jié)編碼
  • GB2312 二字節(jié)編碼
    (Windows 常用)

國際標準

  • UNICODE(2/4字節(jié)) <---> UTF-8 (1~6字節(jié))
    (Linux / Mac OS X / IOS / Android 常用)

python 編碼(encode) 字符串

  • gb2312
  • gbk
  • gb18030
  • utf-8
  • ascii

編碼注釋

在源文件的第一行或第二行寫入如下內(nèi)容為編碼注釋

# -*- coding:gbk -*-
# 設(shè)置源文件編碼為:gbk

with 語句

with 表達式1 [as 變量1], 表達式2 [as 變量2]:
     語句塊
  • 使用于對資源進行訪問的場合,確保使用過程中不管是否發(fā)生異常,都會執(zhí)行必須的'清理'操作,并釋放資源
  • 能夠用于 with 語句進行管理的對象必須是環(huán)境管理器

環(huán)境管理器

  • 類內(nèi)有 __enter____exit__ 實例方法的類被稱為環(huán)境管理器
  • 夠用 with 語句管理的對象必須是環(huán)境管理器
  • __enter__ 方法將在進入with語句時被調(diào)用,并返回由 as 變量管理的對象
  • __exit__ 將在離開 with 語句時被調(diào)用,且可以用參數(shù)來判斷在離開 with 語句時是否有異常發(fā)生并做出相應(yīng)的處理
 class A:
      def __enter__(self):
          print("已進入with語句")
          return self  # 返回的對象將由 as綁定
      def __exit__(self, exc_type, exc_val, exc_tb):
      # exc_type 在沒有異常時為None, 在出現(xiàn)異常時為異常類型
      #  exc_val 在沒有異常時為None, 在出現(xiàn)異常綁定錯誤對象
      #  exc_tb  在沒有異常時為None, 在出現(xiàn)異常時綁定traceback對象
          print("已離開with語句")

對象的屬性管理函數(shù)

  • getattr(obj, name[, default]) 從一個對象得到對象的屬性;getattr(x, 'y') 等同于x.y; 當屬性不存在時,如果給出default參數(shù),則返回default,如果沒有給出default,則產(chǎn)生一個AttributeError錯誤
  • hasattr(obj, name) 用給定的name返回對象obj是否有此屬性,此種做法可以避免在getattr(obj, name)時引發(fā)錯誤
  • setattr(obj, name, value) 給對象obj的名為name的屬性設(shè)置相應(yīng)的值value,set(x, 'y', v) 等同于x.y = v
  • delattr(obj, name) 刪除對象obj中的name屬性, delattr(x, 'y') 等同于 del x.y
class Dog:
    pass

dog1 = Dog()

print(getattr(dog1,'color',None))  # None
dog1.color = 'white'
print(getattr(dog1,'color',None))  # white

print(hasattr(dog1,'kinds'))    # False
print(hasattr(dog1,'color'))    # True
 
setattr(dog1,'age',1)
print(getattr(dog1,'age',None))   # 1

delattr(dog1,'color')
print(getattr(dog1,'color',None))  # None

運算符重載

  • 讓自定義的類生成的對象(實例)能夠使用運算符進行操作
  • 讓自定義的類的實例像內(nèi)建對象一樣運行運算符操作
  • 讓程序簡潔易讀
  • 對自定義的對象,將運算符賦予新的運算規(guī)則
  • 運算符重載不能改變運算符的優(yōu)先級

算術(shù)運算符的重載

  • __add__(self, rhs) self + rhs 加法
  • __sub__(self, rhs) self - rhs 減法
  • __mul__(self, rhs) self * rhs 乘法
  • __truediv__(self, rhs) self / rhs 除法
  • __floordiv__(self, rhs) self // rhs 地板除法
  • __mod__(self, rhs) self % rhs 求余
  • __pow__(self, rhs) self ** rhs

反向算術(shù)運算符的重載

當左手邊的類型為內(nèi)建類型,右手邊為自定義類型時,要實現(xiàn)運算必須用以下方法重載

  • __radd__(self, lhs) lhs + self 加法
  • __rsub__(self, lhs) lhs - self 減法
  • __rmul__(self, lhs) lhs * self 乘法
  • __rtruediv__(self, lhs) lhs / self 除法
  • __rfloordiv__(self, lhs) lhs // self 地板除法
  • __rmod__(self, lhs) lhs % self 求余
  • __rpow__(self, lhs) lhs ** self

復(fù)合賦值算術(shù)運算符的重載

  • __iadd__(self, rhs) self += rhs 加法
  • __isub__(self, rhs) self -= rhs 減法
  • __imul__(self, rhs) self *= rhs 乘法
  • __itruediv__(self, rhs) self /= rhs 除法
  • __ifloordiv__(self, rhs) self //= rhs 地板除法
  • __imod__(self, rhs) self %= rhs 求余
  • __ipow__(self, rhs) self **= rhs
class MyNumber:
    def __init__(self,v):
        self.data = v

    def __repr__(self):
        return 'MyNumber(%d)' % self.data

    def __add__(self,other):
        v = self.data + other.data
        return MyNumber(v)

    def __sub__(self,other):
        v = self.data - other.data
        return MyNumber(v)

n1 = MyNumber(100)
n2 = MyNumber(200)
n3 = n1 + n2  # 相當于 n3 = n1.__add__(n2)
print(n3)
n4 = n3 - n2  # 相當于 n4 = n3.__sub__(n2)
print(n4)
# ************************************************************
class MyList:
    def __init__(self,iterator):
        self.data = list(iterator)

    def __repr__(self):
        return 'MyList(%r)' % self.data

    def __add__(self, other):
        return MyList(self.data + other.data)

    def __mul__(self, other):
        return MyList(self.data * other)

    def __rmul__(self, other):
        return MyList(self.data * other)

    def __iadd__(self, other):
        self.data.extend(other.data)
        return self

l1 = MyList([1,2,3])
l2 = MyList([4,5,6])
l3 = l1 + l2
print(l3)
l4 = l2 + l1
print(l4)
l5 = l1 * 2
print(l5)
l6 = 2 * l2
print(l6)
l7 = MyList([7,8,9])
l7 += l1
print(l7)

比較運算符的重載

比較運算符通常返回 TrueFalse

  • __lt__(self, rhs) self < rhs 小于
  • __le__(self, rhs) self <= rhs 小于等于
  • __gt__(self, rhs) self > rhs 大于
  • __ge__(self, rhs) self >= rhs 大于等于
  • __eq__(self, rhs) self == rhs 等于
  • __ne__(self, rhs) self != rhs 不等于

位運算符重載

  • __invert__(self) ~ self 取反(一元運算符)
  • __and__(self, rhs) self & rhs 位與
  • __or__(self, rhs) self | rhs 位或
  • __xor__(self, rhs) self ^ rhs 位異或
  • __lshift__(self, rhs) self << rhs 左移
  • __rshift__(self, rhs) self >> rhs 右移

反向位運算符重載

  • __rand__(self, lhs) lhs & self 位與
  • __ror__(self, lhs) lhs | self 位或
  • __rxor__(self, lhs) lhs ^ self 位異或
  • __rlshift__(self, lhs) lhs << self 左移
  • __rrshift__(self, lhs) lhs >> self 右移

復(fù)合賦值位運算符重載

  • __iand__(self, rhs) self &= rhs 位與
  • __ior__(self, rhs) self |= rhs 位或
  • __ixor__(self, rhs) self ^= rhs 位異或
  • __ilshift__(self, rhs) self <<= rhs 左移
  • __irshift__(self, rhs) self >>= rhs 右移

一元運算符的重載

  • __neg__(self) - self 負號
  • __pos__(self) + self 正號
  • __invert__(self) ~ self 取反

in / not in 運算符的重載

def __contains__(self, e)     # e in self 成員運算
    pass

索引和切片運算符的重載

讓自定義的類型的對象能夠支持索引和切片操作

  • __getitem__(self, i) x = self[i] 索引/切片取值
  • __setitem__(self, i, v) self[i] = v 索引/切片賦值
  • __delitem__(self, i) del self[i] del 語句刪除索引等

slice 構(gòu)造函數(shù)

  • 用于創(chuàng)建一個 Slice 切片對象,此對象存儲一個切片的起始值,終止值和步長信息
  • slice(start, stop=None, step=None) 創(chuàng)建一個切片對象
    • s.start 切片起始值,默認為None
    • s.stop 切片終止值,默認為None
    • s.step 切片步長,默認為None
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僧叉,一起剝皮案震驚了整個濱河市奕枝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓶堕,老刑警劉巖隘道,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡薄声,警方通過查閱死者的電腦和手機当船,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來默辨,“玉大人德频,你說我怎么就攤上這事∷跣遥” “怎么了壹置?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長表谊。 經(jīng)常有香客問我钞护,道長,這世上最難降的妖魔是什么爆办? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任难咕,我火速辦了婚禮,結(jié)果婚禮上距辆,老公的妹妹穿的比我還像新娘余佃。我一直安慰自己,他們只是感情好跨算,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布爆土。 她就那樣靜靜地躺著,像睡著了一般诸蚕。 火紅的嫁衣襯著肌膚如雪步势。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天背犯,我揣著相機與錄音坏瘩,去河邊找鬼钢悲。 笑死堤瘤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的津函。 我是一名探鬼主播蛉幸,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼破讨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奕纫?” 一聲冷哼從身側(cè)響起提陶,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匹层,沒想到半個月后隙笆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锌蓄,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年撑柔,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘸爽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡铅忿,死狀恐怖剪决,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檀训,我是刑警寧澤柑潦,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站峻凫,受9級特大地震影響渗鬼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荧琼,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一譬胎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铭腕,春花似錦银择、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夹孔。三九已至被盈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搭伤,已是汗流浹背只怎。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怜俐,地道東北人身堡。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拍鲤,于是被迫代替她去往敵國和親贴谎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • # Python關(guān)鍵字 部分單詞沒有分類整理按照順序整理的 ``` statements語句 print輸出 qu...
    ZhouLang閱讀 594評論 0 0
  • python之文件操作 一、文件操作基本流程 計算機系統(tǒng)分為:計算機硬件景鼠,操作系統(tǒng)仲翎,應(yīng)用程序三部分。 我們用pyt...
    go以恒閱讀 430評論 0 4
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,754評論 0 10
  • 文件讀寫 文件讀寫是最基本的IO操作溯香,在Python中內(nèi)置了open函數(shù)來用于文件的讀寫操作鲫构,此函數(shù)創(chuàng)建一個文件對...
    扯扯_2c79閱讀 290評論 0 0
  • 今天看了一資深大咖詩文,獲贊數(shù)萬玫坛,其文自然樸實结笨。 然樸實到毫無韻律可言,且多為平輔直敘昂秃,收尾總無升華禀梳,簡直是狗屁詩...
    彼得瓦爾閱讀 269評論 0 2