第十一章 檔案和流

2021-08-01 07:45:42 字數 3783 閱讀 4976

mode模式 ,   buffering   緩衝

函式返回乙個檔案物件    (所有檔案物件都是可迭代的)

access_mode:檔案使用模式,在open函式中預設為唯讀。其他模式還有:

w:開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。

r+:以讀寫模式開啟

,該檔案必須存在。

w+:以讀寫模式打卡,

若檔案存在則檔案長度清為零,即該檔案內容會消失。

若檔案不存在則建立該檔案。 

a+:以讀/追加寫方式開啟乙個文字檔案。若檔案不存在,則新建乙個文字檔案

rb(binary):以二進位制讀模式開啟

wb:以二進位制寫模式開啟

ab:以二進位制追加模式開啟

rb+:以二進位制讀寫模式開啟

wb+:以二進位制讀寫模式開啟

ab+:以二進位制追加模式開啟

關於二進位制模式:

python用文字模式開啟檔案時,

會轉化換行符

,以保證程式的跨平台使用。這就導致了問題,當使用二進位制檔案時,再使用文字模式開啟可能會破壞二進位制資料。此時應該使用二進位制模式開啟。

(或者可以在模式引數中使用   u    引數,能在開啟檔案時使用通用的換行符支援模式,此模式下,所有的換行符都將被轉換成\n,不必考慮執行的平台)

0 (或者false) i/o(輸入輸出)就是無緩衝的(所有讀寫操作直接針對硬碟)

1(true):i/o   有緩衝,python使用記憶體代替硬碟,使程式更快  。當  使用   flush    或者   close  時才會更新硬碟的資料

大於1:表示緩衝區的大小(位元組)

-1(或者任何負數):表示使用預設的緩衝區大小

檔案物件  和一些   類檔案物件 (有時也叫流)(是指支援一些 file  類方法的物件:最重要的是支援 read和write方法,比如           sys.stdin   sys.stdout   sys.stderr等)   的基本方法

另外,本章的例子都把檔案當成流來操作,也就是說只能按從頭到尾的順序讀資料。

但是,其實可以使用類檔案物件的方法    seek()和tell()   來隨意移動讀取位置(稱為隨機訪問)

f=open()       file()    (open是file的別名)物件常用的方法

read():讀取字串,告訴流要讀多少位元組  read(4)   ,不填就是全讀

write():將字串寫入檔案(追加到檔案中以有字元的後面),寫入物件為字串

close():關閉檔案,這樣快取才會寫入磁碟(flush)

readline():讀取檔案單獨的一行,從當前位置直到換行符的出現,包括行結束符。可加入乙個非負引數,限定readline可讀取的字元的最大值

readlines():讀取乙個檔案的所有行,並作為列表返回

writelines():與readlines 相反,將列表寫入檔案,物件是列表。注意:

程式不會自己新增換行符,要自己加(window系統下,\r\n和\n都可以)

隨機訪問:

seek(offset[,whence]):   把當前讀寫位置,移動到由offset和whence定義的位置   ,offset類是乙個  位元組數  ,表示偏移量。whence(預設為0)表示偏移量是從檔案頭開始計算的(offset必須非負)  whence為1 ,表示相對於當前位置移動,此時offset  可負 。    2表示相對檔案結尾移動

tell():返回當前檔案指標的位置

使用管道可以在乙個命令後面續寫其他的多個命令

$ cat somefile.txt | python somescript.py | sort

在window dos中

type somefile.txt | python somescript.py | sort     

(type 對應cat)

管道符號(|)將乙個命令的標準輸出和下乙個命令的標準輸入連在一起了

比如這裡,somefile.txt 就作為somescript的   sys.stdin 

readline ;  readlines  ;  writelines  ; 見上

還有flush方法

儘管,檔案物件在退出程式後會自動關閉。但最好還是自己關。因為有時候可能程式會崩潰,而這時候修改的資料可能還在快取裡,這樣資料就不會寫進檔案內了。

為了總是關閉檔案,可以使用 

try  /    finally  語句  使得在程式奔潰的情況下也會關閉檔案

with open('somefile.txt') as somefile:

do_something(somefile)

with語句開啟檔案,並且將其賦值到變數 somefile上 。之後就可以對檔案進行操作

重要的是,檔案在語句結束後會被自動關閉,即使是由於異常引起的結束

with還可以使用所謂的上下文管理器(一種支援__enter__和__exit__這兩種方法的物件)(p213  具體去看python文件)

除了使用上面說的方法,還可以用        xreadlines         和           檔案迭代器 

11.3.1   按位元組處理

process表示列印字元

經過檢驗  在換行處,process會輸出乙個換行字元  

f=open(filename)         #乙個字元乙個字元的讀取

while true:

char=f.read(1)

if not char:break

process(char)

f.close()

11.3.2     按行操作

這裡也是,在輸出時,每個process會空一行,最後一行除外(因為沒有換行符)

f=open(filename)

while true:

line=f.readline()

if not line:break

process(line)

f.close()

11.3.3    讀取所有內容

如果檔案不大,可以使用  read (把檔案當作乙個字串)或者  readlines  (把檔案讀入乙個字串列表)

11.3.4  使用  fileinput     實現懶惰行迭代(因為它只讀取實際需要的部分,所以不會佔大量記憶體)

當檔案非常大的時候,前兩個會佔太多記憶體,可以使用 while迴圈遍歷 行  或者 

使用fileinput

input ([files[,inplace[,backup]]) :遍歷多個輸入流中的行,返回能夠用於for迴圈遍歷的物件,可以以列表形式給出多個檔名

inplace(原地處理) 預設為false ,可以(inplace=true)對於要訪問的每一行,需要列印處替代的內容,以返回到當前的輸入檔案

backup 把檔名擴充套件備份。

還有一些其他的方法,見p179

在舊式**中還會使用xreadlines   實現懶惰行迭代,但是因為是舊式的,自己的**中還是最好使用   fileinput        或檔案迭代器

檔案物件其實是可迭代的      (所以之前那些方法幹嘛???)    直接在for 迴圈中使用

f=open(filename)

for line in f:

process(line)

f.close()

同樣,sys.stdin也是可迭代的

Python學習筆記 第十一章 檔案和流

open name mode buffering open函式預設的開啟方式為讀模式。open中模式引數的常用值值描述 r 讀模式 w 寫模式 a 追加模式 b 二進位制模式 可以新增到其他模式中使用 讀 寫模式 可以新增到其他模式中使用 將檔案以二進位制形式開啟,這個只有在python進行換行符轉...

第十一章 操作檔案

2.2 處理檔案 本章主要介紹的內容如下 os是python提供的用來和檔案與目錄互動的模組。operating system作業系統 的縮寫。匯入模組 import os其部分的os函式如下 語法描述 import os 匯入模組os help os os的函式及其功能 os.listdir 列出...

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...