讀寫文件
首先看一個例子:
1
2
3
4
5
|
f = open ( 'thefile.txt' , 'w' ) #以寫方式打開, try : f.write( 'wokao' ) finally : f.close() |
文件的打開方式:
1
2
3
4
5
|
f = open (‘文件 ',' mode') ‘r':只讀(缺省。如果文件不存在,則拋出錯誤) ‘w':只寫(如果文件不存在,則自動創(chuàng)建文件),此時無法調(diào)用f.read()方法,且當(dāng)調(diào)用f.write()時,將清空文件原有內(nèi)容 ‘a':附加到文件末尾 ‘r + ':讀寫 |
如果需要以二進(jìn)制方式打開文件,需要在mode后面加上字符”b”,比如”rb”,”wb”等
文件的屬性:
1
2
3
4
5
6
|
f.closed #標(biāo)記文件是否已經(jīng)關(guān)閉,由close()改寫 f.encoding #文件編碼 f.mode #打開模式 f.name #文件名 f.newlines #文件中用到的換行模式,是一個tuple f.softspace #boolean型,一般為0,據(jù)說用于print |
文件的讀寫方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
f.read([size]) #size為讀取的長度,以byte為單位 f.readline([size]) #讀一行,如果定義了size,有可能返回的只是一行的一部分 f.readlines([size]) #把文件每一行作為一個list的一個成員,并返回這個list。其實它的內(nèi)部是通過循環(huán)調(diào)用readline()來實現(xiàn)的。如果提供size參數(shù),size是表示讀取內(nèi)容的總長,也就是說可能只讀到文件的一部分 f.write( str ) #把str寫到文件中,write()并不會在str后加上一個換行符 f.writelines(seq) #把seq的內(nèi)容全部寫到文件中。這個函數(shù)也只是忠實地寫入,不會在每行后面加上任何東西 f.close() #關(guān)閉文件 f.flush() #把緩沖區(qū)的內(nèi)容寫入硬盤 f.fileno() #返回一個長整型的”文件標(biāo)簽“ f.isatty() #文件是否是一個終端設(shè)備文件(unix系統(tǒng)中的) f.tell() #返回文件操作標(biāo)記的當(dāng)前位置,以文件的開頭為原點 f. next () #返回下一行,并將文件操作標(biāo)記位移到下一行。把一個file用于for … in file這樣的語句時,就是調(diào)用next()函數(shù)來實現(xiàn)遍歷的 f.seek(offset[, from ]) #將文件打操作標(biāo)記移到offset的位置。這個offset一般是相對于文件的開頭來計算的,一般為正數(shù)。但如果提供了from參數(shù)就不一定了,from可以為0表示從頭開始計算,1表示以當(dāng)前位置為原點計算。2表示以文件末尾為原點進(jìn)行計算。需要注意,如果文件以a或a+的模式打開,每次進(jìn)行寫操作時,文件操作標(biāo)記會自動返回到文件末尾。 f.truncate([size]) #把文件裁成規(guī)定的大小,默認(rèn)的是裁到當(dāng)前文件操作標(biāo)記的位置。 |
Python在讀取一個文件時,會記住其在文件中的位置,如果第二次仍需要從頭讀取,則需要調(diào)用f.seek(0)重新從頭開始讀取。
一些例子:
1
2
3
4
5
6
7
8
|
>>> f = open ( 'hi.txt' , 'w' ) >>> f.closed False >>> f.mode 'w' >>> f.name 'hi.txt' >>> f.encoding |
壓縮和解壓縮文件(zip/unzip)
1,單個文件壓縮成zip文件
1
2
3
4
5
6
|
#!/usr/bin/python import zipfile f = zipfile.ZipFile( 'archive.zip' , 'w' ,zipfile.ZIP_DEFLATED) f.write( '1.py' ) f.write( '/root/install.log' ) f.close() |
仔細(xì)觀察壓縮以后的archive.zip,里面有一個1.py和一個root的目錄,root目錄下有一個install.log
ZIP_DEFLATED是壓縮標(biāo)志,如果使用它需要編譯了zlib模塊,如果僅僅是打包而不壓縮的話,可以改為zipfile.ZIP_STORED
2,把zip文件解壓縮
1
2
3
4
5
6
7
8
|
#!/usr/bin/python import zipfile zfile = zipfile.ZipFile( 'archive.zip' , 'r' ) for filename in zfile.namelist(): data = zfile.read(filename) file = open (filename, 'w+b' ) file .write(data) file .close() |
如果archive.zip里有目錄,則在當(dāng)前目錄下也應(yīng)該存在對應(yīng)的目錄,否則會報錯。
3,把整個文件夾壓縮
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/python import zipfile import os f = zipfile.ZipFile( 'archive.zip' , 'w' ,zipfile.ZIP_DEFLATED) startdir = "c:\\mydirectory" for dirpath, dirnames, filenames in os.walk(startdir): for filename in filenames: f.write(os.path.join(dirpath,filename)) f.close() |
如果出現(xiàn):
1
|
Compression requires the (missing) zlib module |
解決方法:
1
|
yum install zlib zlib-devel |
,然后重新編譯安裝python