1. 檔案的基本操作
1.1 檔案的打開或建立
檔案的打開或建立可以使用内置函數file(别名open)。函數聲明如下:
file(name[,mode[,buffering]]) -> file object
或
open(name[,mode[,buffering]]) -> file object
其中,name表示被打開的檔案名稱;mode表示檔案的打開模式;buffering設定緩存模式,0表示不緩存,1
表示行緩存,如果大于1表示緩沖區的大小,以位元組為機關。函數傳回一個file對象
檔案的打開模式(mode)如下:
‘r‘ 隻讀方式打開(預設,如果檔案不存在,則抛出異常)
‘r+‘ 讀寫方式打開(如果檔案不存在,則抛出異常)
‘w‘ 寫入方式打開(覆寫重寫全部内容,如果檔案不存在,則自動建立檔案)
‘w+‘ 讀寫方式打開(覆寫重寫全部内容,如果檔案不存在,則自動建立檔案)
‘a‘ 寫入方式打開(在檔案末尾追加内容,如果檔案不存在,則自動建立檔案)
‘a+‘ 讀寫方式打開(在檔案末尾追加内容,如果檔案不存在,則自動建立檔案)
‘b‘ 二進制模式打開。可與r、w、a、+結合使用。如:‘rb‘,‘wb‘,‘ab‘,‘rb ‘
‘u‘ 支援所有的換行符合。“\r”“\n”“\r\n”都表示換行。
注意:對于圖檔、視訊等檔案必須使用“b”模式讀寫。
file對象的常用屬性和方法:
屬性:
closed
判斷檔案是否關閉,如果檔案被關閉傳回true
encoding
顯示檔案的編碼類型
mode
顯示檔案的打開模式
name
顯示檔案的名稱
newlines
檔案使用的換行模式
方法:
flush()
把緩存區的内容寫入磁盤
close()
關閉檔案。python會在一個檔案不用後自動關閉檔案,不過這一功能沒有保證,最好還是養成手動關閉的
習慣。如果在檔案關閉後對其進行操作會抛出valueerror異常
read([size])
從檔案中讀取全部内容作為字元串傳回。如果指定size,則從檔案中讀取size長度作為字元串傳回,size
以byte為機關
readline([size])
從檔案中讀取一行作為字元串傳回。如果指定size,則傳回讀取行的一部分
readlines([size])
從檔案中讀取每一行作為一個list傳回。如果提供size參數,表示每次讀取的位元組數
seek(offset[,whence])
将檔案指針移到offset的位置。這個offset一般是相對于檔案的開頭來計算的,一般為正數。但如果提供
了whence參數就不一定了,whence為0表示從頭開始計算,1表示以目前位置開始計算,2表示以檔案末尾進
行計算。需要注意,如果檔案以a或a+的模式打開,每次進行寫操作時,檔案操作标記會自動傳回到檔案末
尾。
tell()
傳回檔案指針目前位置,以檔案的開頭為原點
next()
傳回下一行的内容,并将檔案指針移到下一行。for line in file這樣的語句,就是調用next()函數來實
現周遊的。
truncate([size])
删除size個位元組的内容。
write(str)
把str寫到檔案中,write()并不會在str後加上一個換行符
writelines(seq)
把字元串序列seq的内容全部寫到檔案中(多行一次性寫入)。這個函數也不會在str後加上一個換行符
1.2. 檔案的讀取
1.2.1 按行讀取方式readline()
readline()每次讀取檔案中的一行。需要使用永真表達式循環讀取檔案。當檔案指針移到到檔案末尾,依
然使用readline()讀取檔案将出現錯誤。是以程式中需求添加一個判斷語句,判斷檔案指針是否移到到文
件末尾,并且通過語句中斷循環。
例如:
file=open(‘example.txt‘)
while true:
line=file.readline()
if line:
print(line)
else:
break
file.close()
1.2.2 多行讀取方式readlines()
使用readlines()讀取檔案,需要通過循環通路readlines()傳回清單[line1,line2,...linen]裡的元素。
readlines()一次可讀多行資料,為避免将檔案所有内容加載到記憶體中,常使用這種方法以提供效率。
lines=file.readlines()
for line in lines:
print(line)
1.2.2 一次性讀取方式read()
read()将從檔案中讀取所有内容,并指派給一個字元串變量。
context=file.read()
print(context)
注意:file對象内部将記錄檔案指針的位置,以便下次操作。隻要file對象沒有執行close()方法,檔案指
針就不會釋放。
1.3 檔案的寫入
單行寫入方式write()
write(string)
将一個字元串寫入檔案,再close()關閉檔案。
多行寫入方式writelines()
writelines([string1,string2,…])
一次寫入多行,将清單中的元素一次寫入檔案
注意:write()和writelines()寫入前都會清楚檔案中的原有内容,在重新寫入新的内容,相當于“覆寫”
的方式。如果需要保留檔案中的原有内容,可以使用“a+”模式打開檔案。
用writelines()寫檔案的速度更快。如果寫入檔案的字元串比較多,可以使用writelines()以提高效率。
1.4 檔案的删除
檔案的删除要用到os子產品和os.path子產品。os子產品提供了對系統環境、檔案、目錄等作業系統級的接口函數
。os子產品常用的檔案處理函數:
chdir(dirname)
把目前工作目錄切換到dirname下
getcwd()
傳回目前的工作目錄路徑
mkdir(path,[mode])
建立目錄。mode的意義參見os.chmod(),預設是0777
makedirs(path,[mode])
和os.mkdir()類似,不過會先建立不存在的父目錄。
readlink(path)
傳回path這個符号連結所指向的路徑
remove(path)
删除檔案,不能用于删除目錄
rmdir(path)
删除檔案夾,不能用于删除檔案
shutil.rmtree(path[,ignore_errors[,onerror]])
删除檔案夾
rename(old,new)
重命名檔案
stat(path)
傳回path指定檔案所有屬性
fstat(path)
傳回打開檔案所有屬性
statfile(filepath[,opration])
啟動關聯程式打開檔案
tmpfile()
建立并打開(‘w+b‘)一個新的臨時檔案
walk()
生成一個目錄樹下的所有檔案名
os.path子產品用于處理檔案和目錄的路徑。os.path子產品常用的檔案處理函數:
abspath(path)
把path轉成絕對路徑
dirname(p)
傳回目錄的路徑
exists(path)
判斷檔案或者目錄是否存在
getatime(path)
傳回path所指向的檔案或者目錄的最後通路時間。
getmtime(path)
傳回path所指向的檔案或者目錄的最後修改時間
getctime(path)
傳回path所指向的檔案的建立時間
getsize(path)
傳回path所指向的檔案的大小
isabs(s)
判斷路徑是否為絕對位址
isfile(path)
判斷path所指向的是否是一個普通檔案,而不是目錄
isdir(path)
判斷path所指向的是否是一個目錄,而不是普通檔案
split(path) -> (dirname,basename)
這個函數會把一個路徑分離為兩部分,比如:os.path.split(”/foo/bar.dat”)會傳回
(”/foo”,”bar.dat”)
splitext(path)
把path分離成基本名和擴充名。比如:os.path.splitext(”/foo/bar.tar.bz2″)傳回(’/foo/bar.tar’
, ‘.bz2′)。要注意它和os.path.split()的差別
splitdrive(path)
把path分離成基本名和驅動器。
walk(top,func,arg)
周遊目錄數,與os.walk()功能相同
join(dirname,basename)
這個函數會把目錄名和檔案名組合成一個完整的路徑名,比如:os.path.join(”/foo”,”bar.dat”)會
傳回”/foo/bar.dat”。這個函數和os.path.split()剛好相反。
expanduser(path)
把path中包含的”~”和”~user”轉換成使用者目錄
expandvars(path)
根據環境變量的值替換path中包含的”$name”和”${name}”,比如環境變量fish=nothing,那
os.path.expandvars(”$fish/abc”)會傳回”nothing/abc”
normpath(path)
去掉path中包含的”.”和”..”
islink(path)
判斷path所指向的是否是一個符号連結
ismount(path)
判斷path所指向的是否是一個挂接點(mount point)
1.5 檔案的複制和移動
複制檔案可以使用shutil子產品的copyfile()函數:
copyfile(src,dst)
其中,src表示源檔案路徑,dst表示目标檔案路徑
移動檔案可以使用shutil子產品的move()函數:
move(src,dst)
1.6 檔案的重命名
檔案的重命名需要用到os.rename()
#修改檔案名
import os
list=os.listdir(‘.‘)
if ‘example.txt‘ in list:
os.rename(‘example.txt‘,‘somename.txt‘)
1.7 檔案内容的查找和替換
1.7.1 檔案内容的查找
檔案内容的查找需要使用re子產品
re.findall(‘some pattern‘,str)
1.7.2 檔案内容的替換
string.replace(‘strold‘,‘strnew‘)[.replace(‘strold‘,‘strnew‘)[…]]
1.8 配置檔案的通路
配置檔案ini由多個塊組成,每個塊由多個配置項組成。python有configparser子產品用于解析配置檔案
1.8.1 建立及更新配置檔案
import configparser
def savesetting(self,section,key,values):
config = configparser.configparser()
try:
ini = open(‘setting.ini‘, ‘r+‘)
config.read(‘setting.ini‘)
config[str(section)][str(key)]=str(values)
config.write(ini)
ini.close()
except ioerror:
ini = open(‘setting.ini‘, ‘w‘)
config[str(section)]={}
except keyerror:
del config
1.8.1 讀取配置檔案
def getsetting(self,section,key):
values = config[str(section)][str(key)]
values = none
return values
2. 目錄的基本操作
2.1 目錄的建立和删除
os子產品提供了針對目錄進行操作的函數。常見目錄處理函數:
mkdir(path[,mode=0777])
建立path指定的一個目錄
makedirs(name,mode=511)
建立多級目錄,name表示“path1/path2/…”
删除path指定的目錄
removedirs(path)
删除path指定的多級目錄
listdir(path)
傳回path指定目錄下所有的檔案名
傳回目前的工作目錄
chdir(path)
将目前目錄改為path指定目錄
walk(top,topdown=true,onerror=none)
周遊目錄樹
2.2 目錄的周遊
2.2.1 遞歸函數
def visitdir(path):
list=os.listdir(path)
for p in list:
pathname=os.path.join(path,p)
if not os.path.isfile(pathname):
visitdir(pathname)
else:
print(pathname)
2.2.2 os.path.walk()
os.path.walk()函數聲明如下:
其中,top表示需要周遊的目錄樹的路徑;func表示回調函數;arg是傳輸給回調函數的func的元組。例如:
import os,os.path
def visitdir(arg,dirname,names):
for filename in names:
print(os.path,join(dirname,filepath))
path=‘d:\path‘
os.path.walk(path,visitdir,())
2.2.3 os.walk()
os.walk()可用于目錄的周遊。os.walk()比os.path.walk()效率高,而且不需要回調函數,更容易使用。os.path()聲明如下:
其中,top表示需要周遊的目錄樹的路徑;topdown預設值為true,表示首先傳回目錄樹下的檔案,然後再周遊目錄樹下的子目錄,false表示順序相反;onerror預設值為none,表示忽略目錄周遊産生的錯誤。該函數傳回一個元組,包含每次周遊的路徑名、目錄清單和檔案清單三個元素。例如:
for root,dirs,files in os.walk(path):
for filepath in files:
print(os.path,join(root,filepath))
os.path.walk(path)