本章將介紹python的文件處理和相關輸入輸出能力。
包括介紹文件對象(它的內建函數、內建方法和屬性)、標準文件、同時討論文件系統的訪問方法、文件執行、最后簡潔介紹持久存儲和標準庫中與文件有關的模塊
內建函數open()和file() 提供了初始化輸入/輸出(I/O)操作的通用接口。
內建函數open()
基本語法:
file_object = open(file_name,access_mode='r',buffering=-1)
file_name是包含要打開的文件名字的字符串,它可以是相對路徑或者絕對路徑。可選變量access_mode也是一個字符串,代表打開文件的模式,默認是讀取模式'r'
一些打開文件的例子:
fp = open('/etc/motd') #以讀的方式打開
fp = open('test', 'w') #以寫的方式打開
fp = open('data', 'r+') #以讀寫方式打開
fp = open(r'c: \io.sys', 'rb') #以二進制讀模式打開
工廠函數file()
open()和file()函數具有相同的功能,可以任意替換。
文件的內建方法
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()方法用來讀取字節到字符串中,最多讀取給定數目個字節。
#readline()方法讀取打開文件的一行(讀取下個行結束符之前的所有字節)。然后整行,包括行結束,作為字符串返回。
#readlines()會讀取所有(剩余的)行然后把它們作為一個字符串列表返回。它的可選參數sizehit代表返回的最大字節大小
#xreadlines()不是一次性讀取所有行,而是每次讀取一塊,所以用在for循環時可以減小對內存的占用,不過,隨著Python中的迭代器和文件迭代的引入,沒有必要再使用xreadlines(),因為與使用iter(file)和在for循環中文件迭代 for eachLine in file效果是一樣的。
#輸出
#write()方法把含有文本數據或者二進制數據塊的字符串寫入到文件中。
#writelines()方法是針對列表的操作,它接受一個字符串列表作為參數,將它們寫入文件。行結束符并不會被自動加入,必須在調用writelines()前給每行結尾加入上行結束符。
#文件內移動
#seek()方法可以在文件中移動文件指針到不同的位置。offset字節代表相對于某個位置的偏移量。位置的默認值為0,代表從文件的開頭算起(即絕對偏移量),1代表從當前位置算起,2代表從文件末尾算起。
#文件迭代
#一行一行的訪問文件很簡單:
for eachLine in f
...
#在這個循環里,eachLine代表文本文件中的一行(包括末尾的行結束符)。
#其他
#close() 通過關閉文件來結束對它的訪問。Python垃圾收集機制也會在文件對象的引用計數降至零的時候關閉文件。如果你不顯式地關閉文件,那么你可能丟失輸出緩沖區的數據。
#fileno()方法返回打開文件的描述符。
#flush()方法會直接把內部緩沖區中的數據立即寫入文件,而不是被動地等待輸出緩沖區被寫入。
#isatty()方法是一個布爾內建函數,當文件是一個類tty設備時返回True,否則返回False
#truncate()方法是將文件截取到當前文件指針位置或者到給定size,以字節為單位
- 有助于開平臺開發的os模塊屬性
os 模塊屬性 | 描述 |
---|---|
linesep | 用于在文件中分隔行的字符串 |
sep | 用于分隔文件路徑名的字符串 |
pathsep | 用于分隔文件路徑名的字符串 |
curdir | 當前工作目錄的字符串名稱 |
pardir | (當前工作目錄)父目錄字符串名稱 |
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()
標準文件
一般來說,只要你的程序一執行,你就可以訪問3個標準文件。它們分別是標準輸入(一般是鍵盤)、標準輸出(到顯示器的緩沖輸出)和標準錯誤(到屏幕的非緩沖輸出),命名分別是stdin
stdout
stderr
。
Python中可以通過sys模塊來訪問這些文件的句柄。導入sys模塊之后,就可以使用sys.stdin
sys.stdout
sys.stderr
來訪問。
print語句通常是輸出到sys.stdout
而內建函數 raw_input()則通常從sys.stdin
接收輸入
命令行參數
sys模塊通過 sys.argv 屬性提供了對命令行參數的訪問。
argv
變量代表一個從命令行上輸入的各個參數組成的字符串數組;
argc
變量代表輸入的參數個數
在Python中,argc
就是sys.argv
列表的長度,即len(sys.argv)
,而該列表的第一項sys.argv[0]
永遠是程序的名稱
總結如下:
- **
sys.argv
是命令行參數的列表** - **
len(sys.argv)
是命令行參數的個數(也就是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'
文件執行
-
永久存儲模塊
pickle模塊
marshal模塊
文件相關模塊
模塊 | 內容 |
---|---|
base64 | 提供二進制字符串和文本字符串間的編碼/解碼操作 |
binascii | 提供二進制和ASCII編碼的二進制字符串間的編碼/解碼操作 |
bz2 | 訪問BZ2格式的壓縮文件 |
csv | 訪問csv文件(以逗號分隔文件) |
filecmp | 用于比較目錄和文件 |
fileinput | 提供多個文本文件的行迭代器 |
getopt/optparse | 提供了命令行參數的解析/處理 |
gzip/zlib | 讀寫GNU zip(gzip)文件(壓縮需要zlib 模塊) |
shutil | 提供高級文件訪問功能 |
c/StringIO | 對字符串對象提供類文件接口 |
tarfile | 讀寫TAR歸檔文件,支持壓縮文件 |
tempfile | 創建臨時文件(名) |
uu | uu 格式的編碼/解碼 |
zipfile | 用于讀取ZIP歸檔文件的工具 |