天天看點

python檔案操作

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)