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的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...