本章將介紹python的文件處理和相關(guān)輸入輸出能力趁俊。
包括介紹文件對象(它的內(nèi)建函數(shù)脚作、內(nèi)建方法和屬性)警没、標(biāo)準(zhǔn)文件匈辱、同時討論文件系統(tǒng)的訪問方法、文件執(zhí)行杀迹、最后簡潔介紹持久存儲和標(biāo)準(zhǔn)庫中與文件有關(guān)的模塊
內(nèi)建函數(shù)open()和file() 提供了初始化輸入/輸出(I/O)操作的通用接口亡脸。
內(nèi)建函數(shù)open()
基本語法:
file_object = open(file_name,access_mode='r',buffering=-1)
file_name是包含要打開的文件名字的字符串,它可以是相對路徑或者絕對路徑树酪」j可選變量access_mode也是一個字符串,代表打開文件的模式嗅回,默認(rèn)是讀取模式'r'
一些打開文件的例子:
fp = open('/etc/motd') #以讀的方式打開
fp = open('test', 'w') #以寫的方式打開
fp = open('data', 'r+') #以讀寫方式打開
fp = open(r'c: \io.sys', 'rb') #以二進(jìn)制讀模式打開
工廠函數(shù)file()
open()和file()函數(shù)具有相同的功能及穗,可以任意替換。
文件的內(nèi)建方法
In [1]: f = open('/tmp/test3','r+')
In [2]: f.
f.close f.fileno f.name f.readinto f.softspace f.writelines
f.closed f.flush f.newlines f.readline f.tell f.xreadlines
f.encoding f.isatty f.next f.readlines f.truncate
f.errors f.mode f.read f.seek f.write
#輸入
#read()方法用來讀取字節(jié)到字符串中绵载,最多讀取給定數(shù)目個字節(jié)埂陆。
#readline()方法讀取打開文件的一行(讀取下個行結(jié)束符之前的所有字節(jié))。然后整行娃豹,包括行結(jié)束焚虱,作為字符串返回。
#readlines()會讀取所有(剩余的)行然后把它們作為一個字符串列表返回懂版。它的可選參數(shù)sizehit代表返回的最大字節(jié)大小
#xreadlines()不是一次性讀取所有行鹃栽,而是每次讀取一塊,所以用在for循環(huán)時可以減小對內(nèi)存的占用躯畴,不過民鼓,隨著Python中的迭代器和文件迭代的引入薇芝,沒有必要再使用xreadlines(),因為與使用iter(file)和在for循環(huán)中文件迭代 for eachLine in file效果是一樣的丰嘉。
#輸出
#write()方法把含有文本數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)塊的字符串寫入到文件中夯到。
#writelines()方法是針對列表的操作,它接受一個字符串列表作為參數(shù)饮亏,將它們寫入文件耍贾。行結(jié)束符并不會被自動加入,必須在調(diào)用writelines()前給每行結(jié)尾加入上行結(jié)束符路幸。
#文件內(nèi)移動
#seek()方法可以在文件中移動文件指針到不同的位置荐开。offset字節(jié)代表相對于某個位置的偏移量。位置的默認(rèn)值為0简肴,代表從文件的開頭算起(即絕對偏移量)晃听,1代表從當(dāng)前位置算起,2代表從文件末尾算起着帽。
#文件迭代
#一行一行的訪問文件很簡單:
for eachLine in f
...
#在這個循環(huán)里,eachLine代表文本文件中的一行(包括末尾的行結(jié)束符)移层。
#其他
#close() 通過關(guān)閉文件來結(jié)束對它的訪問仍翰。Python垃圾收集機(jī)制也會在文件對象的引用計數(shù)降至零的時候關(guān)閉文件。如果你不顯式地關(guān)閉文件观话,那么你可能丟失輸出緩沖區(qū)的數(shù)據(jù)予借。
#fileno()方法返回打開文件的描述符。
#flush()方法會直接把內(nèi)部緩沖區(qū)中的數(shù)據(jù)立即寫入文件频蛔,而不是被動地等待輸出緩沖區(qū)被寫入灵迫。
#isatty()方法是一個布爾內(nèi)建函數(shù),當(dāng)文件是一個類tty設(shè)備時返回True晦溪,否則返回False
#truncate()方法是將文件截取到當(dāng)前文件指針位置或者到給定size瀑粥,以字節(jié)為單位
- 有助于開平臺開發(fā)的os模塊屬性
os 模塊屬性 | 描述 |
---|---|
linesep | 用于在文件中分隔行的字符串 |
sep | 用于分隔文件路徑名的字符串 |
pathsep | 用于分隔文件路徑名的字符串 |
curdir | 當(dāng)前工作目錄的字符串名稱 |
pardir | (當(dāng)前工作目錄)父目錄字符串名稱 |
filename = raw_input('Enter file name: ')
fobj = open(filename,'w')
while True:
aLine = raw_input('Enter a line('.' to quit): ')
if aLine != '.':
fobj.write('%s%s' % (aLine,os.linesep))
else:
break
fobj.close()
標(biāo)準(zhǔn)文件
一般來說,只要你的程序一執(zhí)行三圆,你就可以訪問3個標(biāo)準(zhǔn)文件狞换。它們分別是標(biāo)準(zhǔn)輸入(一般是鍵盤)、標(biāo)準(zhǔn)輸出(到顯示器的緩沖輸出)和標(biāo)準(zhǔn)錯誤(到屏幕的非緩沖輸出)舟肉,命名分別是stdin
stdout
stderr
修噪。
Python中可以通過sys模塊來訪問這些文件的句柄。導(dǎo)入sys模塊之后路媚,就可以使用sys.stdin
sys.stdout
sys.stderr
來訪問黄琼。
print語句通常是輸出到sys.stdout
而內(nèi)建函數(shù) raw_input()則通常從sys.stdin
接收輸入
命令行參數(shù)
sys模塊通過 sys.argv 屬性提供了對命令行參數(shù)的訪問。
argv
變量代表一個從命令行上輸入的各個參數(shù)組成的字符串?dāng)?shù)組整慎;
argc
變量代表輸入的參數(shù)個數(shù)
在Python中脏款,argc
就是sys.argv
列表的長度围苫,即len(sys.argv)
,而該列表的第一項sys.argv[0]
永遠(yuǎn)是程序的名稱
總結(jié)如下:
- **
sys.argv
是命令行參數(shù)的列表** - **
len(sys.argv)
是命令行參數(shù)的個數(shù)(也就是sys.argc
)
測試程序:
import sys
print 'you entered', len(sys.argv), 'arguments...'
pring 'they are: ',str(sys.argv)
$argv.py 76 tales 85 hawk
you entered 5 arguments...
they are: ['argv.py','76','tales','85','hawk']
os和os.path模塊的例子(ospathex.py)
#!/usr/bin/env python
import os
for tmpdir in ('/tmp',r'c: \temp'):
if os.path.isdir(tmpdir):
break
else:
print 'no temp directory available'
tmpdir = ''
if tmpdir:
os.chdir(tmpdir)
cwd = os.getcwd()
print '*** current temporary directory'
print cwd
print '*** creating example directory...'
os.mkdir('example')
os.chdir('example')
cwd = os.getcwd()
print '*** new working directory...'
print cwd
print '*** original directory listing:'
print os.listdir(cwd)
print '*** creating test file ...'
fobj = open('test','w')
fobj.write('foo\n')
aline = 'bar'
fobj.write('%s%s' %(aline,os.linesep))
fobj.close()
print '*** updated directory listing:'
print os.listdir(cwd)
print "*** renaming 'test' to 'filetest.txt'"
os.rename('test','filetest.txt')
print '*** updated directory listing:'
print os.listdir(cwd)
path = os.path.join(cwd,os.listdir(cwd)[0])
print '*** full file pathname:'
print path
print '*** (pathname,basename) =='
print os.path.split(path)
print '*** (filename,extension) =='
print os.path.splittext(os.path.basename(path))
print '*** displaying file contents:'
fobj = open(path)
for eachLine in fobj:
print eachLine
fobj.close()
print '*** deleting test file'
os.remove(path)
print '*** updated directory listing:'
print os.listdir(cwd)
os.chdir(os.pardir)
print '*** deleting test directory'
os.rmdir('example')
print '*** Done'
文件執(zhí)行
-
永久存儲模塊
pickle模塊
marshal模塊
文件相關(guān)模塊
模塊 | 內(nèi)容 |
---|---|
base64 | 提供二進(jìn)制字符串和文本字符串間的編碼/解碼操作 |
binascii | 提供二進(jìn)制和ASCII編碼的二進(jìn)制字符串間的編碼/解碼操作 |
bz2 | 訪問BZ2格式的壓縮文件 |
csv | 訪問csv文件(以逗號分隔文件) |
filecmp | 用于比較目錄和文件 |
fileinput | 提供多個文本文件的行迭代器 |
getopt/optparse | 提供了命令行參數(shù)的解析/處理 |
gzip/zlib | 讀寫GNU zip(gzip)文件(壓縮需要zlib 模塊) |
shutil | 提供高級文件訪問功能 |
c/StringIO | 對字符串對象提供類文件接口 |
tarfile | 讀寫TAR歸檔文件,支持壓縮文件 |
tempfile | 創(chuàng)建臨時文件(名) |
uu | uu 格式的編碼/解碼 |
zipfile | 用于讀取ZIP歸檔文件的工具 |