6. 文件操作

[TOC]

文件處理

流程

  1. 打開文件
    open()
    f = open(filename,mode = '')
  2. 操作文件
  3. 關(guān)閉文件
    close()

模式:

常用模式

以下這三種模式,和+模式相比,就是+號(hào)模式可以讀寫文件,而這里的模式只能讀或者寫

r:如果未制定mode,默認(rèn)為‘r’模式
w:只寫,會(huì)把原先存在的文件覆蓋,如果制定文件不存在,會(huì)創(chuàng)建文件
a:追加模式,寫數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)添加到(已存)文件的末尾

如果在a模式下,需要在文件中添加一段內(nèi)容,但是不是在末尾,a模式是否可以用?

字節(jié)模式(二進(jìn)制操作):

rb wb ab

獲取字節(jié)數(shù)據(jù),不需要進(jìn)行解碼,但在寫入數(shù)據(jù)的時(shí)候,需要對(duì)數(shù)據(jù)(二進(jìn)制)進(jìn)行制定編碼
范例代碼:

>>> s = 'this is a test'
>>> b = bytes(s,encoding = 'utf-8')
>>>
>>> f = open('test.txt','w')
>>> f.write(s)
14

>>> f = open('test.txt','wb')
>>> f.write(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'


>>> f = open('test.txt','wb')
>>> f.write(b)
14

上述代碼中,首先輸入的內(nèi)容s為一個(gè)str類型,b是一個(gè)將s轉(zhuǎn)制成byte類型之后的字節(jié)串
第一段代碼正常輸入字符串s
反饋回來是正常寫入文件結(jié)果:14(?為什么是14)

第二段代碼是輸入字符串s
但是文件打開方式為wb(字節(jié)串類型寫入)
反饋回來報(bào)錯(cuò):需要一個(gè)字節(jié)串類型對(duì)象,而不是str類型

第三段代碼是輸入字節(jié)串b
文件打開方式為wb
正確輸入

因此,在使用b模式的時(shí)候一定要注意傳入的數(shù)據(jù)類型。非b模式下,以字符為單位進(jìn)行讀寫,有b模式下,以字節(jié)為單位讀寫。

可讀可寫模式:

  • r+追加寫
    默認(rèn)光標(biāo)在開始位置,寫的話一定是追加寫
    相對(duì)來說最好的讀寫模式,配合seek(),tell()方法可以實(shí)現(xiàn)大部分操作

  • w+覆蓋寫
    如果要讀取,f.seek()指定光標(biāo)位置,按照字節(jié)走,如果字節(jié)讀取不全,就會(huì)報(bào)錯(cuò)
    這種模式在讀寫之前都會(huì)清空文件內(nèi)容,盡量不要使用!

  • a+追加寫
    讀取內(nèi)容也需要通過seek調(diào)整,光標(biāo)默認(rèn)在文件最后位置,不論光標(biāo)位置,總是在最后位置添加

操作文件

文件是可迭代對(duì)象,按行進(jìn)行迭代

f = open(filename,mode = '')

常用文件操作方法

  • read():讀指定個(gè)數(shù)的字符,f.read(10)。如果打開方式有b,那么以字節(jié)為單位進(jìn)行讀取,如果沒有b,就以字符為單位進(jìn)行讀取
    其中,for line in f:表示按行讀取,這個(gè)叫做文件的逐行迭代,文件是一種可以迭代類型

  • write():根據(jù)上面的范例可以看出,如果打開方式?jīng)]有b,則接受普通字符串為參數(shù),如果有b,就需要傳入bytes類型的對(duì)象

  • readline():讀入一行,b模式下返回bytes類型,非b模式下返回一行字符串,可以指定數(shù)量參數(shù)

  • readlines():按行讀取數(shù)據(jù),并且返回的行被存在列表中,可以指定數(shù)量參數(shù)

  • seek():將指針指向制定的下標(biāo)處,此處要注意使用的模式,在某些模式下,指針指定在哪些位置都只能影響讀取的位置,但是寫入只能寫在固定的位置。比如w+或者是a+模式。以字節(jié)為單位進(jìn)行計(jì)數(shù)

  • tell():用于獲取當(dāng)前指針的位置,和seek()一樣永遠(yuǎn)以字節(jié)為單位進(jìn)行計(jì)數(shù)

  • flush():將剛寫入的內(nèi)容刷新到本地文件。默認(rèn)情況下,在文件關(guān)閉后,緩存內(nèi)的數(shù)據(jù)才會(huì)寫入本地文件,這樣可能會(huì)造成數(shù)據(jù)訪問不一致。

seek詳解:

seek的三種模式:

  1. f.seek(p,0)移動(dòng)到當(dāng)前文件第p個(gè)字節(jié)處,絕對(duì)位置
  2. f.seek(p,1)移動(dòng)到相當(dāng)于當(dāng)前位置后的p個(gè)字節(jié)
  3. f.seek(p.2)移動(dòng)到文章尾后的p個(gè)字節(jié)

with————上下文管理器

with open('test.txt','w')as f:
     f.write('str')

在python2.7版本后,with支持同時(shí)打開多個(gè)文件
with open('log1') as obj1, open('log2') as obj2
with 不但能管理文件,還能管理別的對(duì)象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,169評(píng)論 2 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,298評(píng)論 6 13
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,584評(píng)論 9 468
  • 我媽搬家的時(shí)候叫我過去收拾我的東西。在一個(gè)隱藏的小柜子里放著我很久以前寫的日記。我似乎是斷斷續(xù)續(xù)地寫過一陣子,沒想...
    兩個(gè)栗子閱讀 839評(píng)論 3 4

友情鏈接更多精彩內(nèi)容