Python入門(mén)篇之文件
文件處理的函數(shù)和方法
使用Open()函數(shù)可打開(kāi)文件,語(yǔ)法格式如下:
file_handler = open(filename,[,mode[,bufsize]]
filename是你要操作的文件名,如果不在當(dāng)前路徑,需指出具體路徑。mode是打開(kāi)文件的模式,表示你要如何操作文件,bufsize表示是否使用緩存。
mode
模式 | 描述 |
---|---|
r | 以讀方式打開(kāi)文件,可讀取文件信息。 |
w | 以寫(xiě)方式打開(kāi)文件,可向文件寫(xiě)入信息。 |
a | 以追加方式打開(kāi)文件,文件指針自動(dòng)移到文件尾。 |
r+ | 以讀寫(xiě)方式打開(kāi)文件,可對(duì)文件進(jìn)行讀和寫(xiě)操作。 |
w+ | 消除文件內(nèi)容,然后以讀寫(xiě)方式打開(kāi)文件。 |
a+ | 以讀寫(xiě)方式打開(kāi)文件,并把文件指針移到文件尾。 |
b | 以二進(jìn)制模式打開(kāi)文件,而不是以文本模式。該模式只對(duì)Windows或Dos有效,類(lèi)Unix的文件是用二進(jìn)制模式進(jìn)行操作的。 |
bufsize
bufsize取值 | 描述 |
---|---|
0 | 禁用緩沖 |
1 | 行緩沖 |
>1 | 指定緩沖區(qū)的大小 |
<1 | 系統(tǒng)默認(rèn)的緩沖區(qū)大小 |
open()函數(shù)返回一個(gè)文件對(duì)象,我們可通過(guò)read()或write()函數(shù)對(duì)文件進(jìn)行讀寫(xiě)操作,下面是一些文件對(duì)象方法:
文件對(duì)象方法
方法 | 描述 |
---|---|
f.close() | 關(guān)閉文件,記住用open()打開(kāi)文件后一定要記得關(guān)閉它,否則會(huì)占用系統(tǒng)的可打開(kāi)文件句柄數(shù)。 |
f.fileno() | 獲得文件描述符 |
f.flush() | 刷新輸出緩存 |
f.isatty() | 如果文件是一個(gè)交互終端,則返回True,否則返回False。 |
f.read([count]) | 讀出文件,如果有count,則讀出count個(gè)字節(jié)。 |
f.readline() | 讀出一行信息。 |
f.readlines() | 讀出所有行,也就是讀出整個(gè)文件的信息。 |
f.seek(offset[,where]) | 把文件指針移動(dòng)到相對(duì)于where的offset位置。offset為0表示文件開(kāi)始處,這是默認(rèn)值 ;1表示當(dāng)前位置;2表示文件結(jié)尾。 |
f.tell() | 獲得文件指針位置。 |
f.truncate([size]) | 截取文件,使文件的大小為size。 |
f.write(string) | 把string字符串寫(xiě)入文件。 |
f.writelines(list) | 把list中的字符串一行一行地寫(xiě)入文件。 |
示例
1.文件的打開(kāi)或創(chuàng)建
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
filehandler = open('test.txt','w') #以寫(xiě)模式打開(kāi)文件,如果文件不存在則創(chuàng)建
filehandler.write('this is a file open/create test.\nthe second line.')
filehandler.close()
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
filehandler = open('test.txt','a') #以追加模式打開(kāi)文件,如果文件不存在則創(chuàng)建
filehandler.write('\nappend the text in another line.\n')
filehandler.close()
2.讀取文件
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
filehandler = open('test.txt','r') #以讀方式打開(kāi)文件,rb為二進(jìn)制方式(如圖片或可執(zhí)行文件等)
print 'read() function:' #讀取整個(gè)文件
print filehandler.read()
print 'readline() function:' #返回文件頭,讀取一行
filehandler.seek(0)
print filehandler.readline()
print 'readlines() function:' #返回文件頭,返回所有行的列表
filehandler.seek(0)
print filehandler.readlines()
print 'list all lines' #返回文件頭,顯示所有行
filehandler.seek(0)
textlist = filehandler.readlines()
for line in textlist:
print line
print 'seek() function' #移位到第32個(gè)字符,從33個(gè)字符開(kāi)始顯示余下內(nèi)容
filehandler.seek(32)
print filehandler.read()
print 'tell() function' #移位到文件頭,從頭開(kāi)始顯示2位字符
filehandler.seek(0)
print filehandler.readline() #顯示第一行內(nèi)容
print filehandler.tell() #顯示當(dāng)前位置
print filehandler.readline() #顯示第二行內(nèi)容
print filehandler.read() #顯示余下所有內(nèi)容
filehandler.close() #關(guān)閉文件句柄
3.文件系統(tǒng)操作
#!/usr/bin/env python
#-*- encoding:utf-8 -*-
import os,fnmatch,glob
for fileName in os.listdir ( '/root' ): #列出/root目錄內(nèi)容,不包括.和..
print fileName
os.mkdir('py') #在當(dāng)前目錄下創(chuàng)建一個(gè)py目錄,且只能創(chuàng)建一層
os.rmdir( 'py') #在當(dāng)前目錄下刪除py目錄,且只能刪除一層
os.makedirs('py/aa') #可創(chuàng)建多層目錄
os.removedirs('py/aa') #可刪除多層目錄
print 'demonstration fnmatch module'
for fileName in os.listdir ( '/root/python/file' ):
if fnmatch.fnmatch(fileName,'*.txt'): #利用UNIX風(fēng)格的通配,只顯示后綴為txt的文件
print fileName
print 'demonstration glob module'
for fileName in glob.glob ( '*.txt' ): #利用UNIX風(fēng)格的通配,只顯示后綴為txt的文件
print fileName
4.獲取文件狀態(tài)
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
import os,time,stat
fileStats = os.stat ( 'test.txt' ) #獲取文件/目錄的狀態(tài)
fileInfo = {
'Size':fileStats [ stat.ST_SIZE ], #獲取文件大小
'LastModified':time.ctime( fileStats [ stat.ST_MTIME ] ), #獲取文件最后修改時(shí)間
'LastAccessed':time.ctime( fileStats [ stat.ST_ATIME ] ), #獲取文件最后訪問(wèn)時(shí)間
'CreationTime':time.ctime( fileStats [ stat.ST_CTIME ] ), #獲取文件創(chuàng)建時(shí)間
'Mode':fileStats [ stat.ST_MODE ] #獲取文件的模式
}
#print fileInfo
for field in fileInfo: #顯示對(duì)象內(nèi)容
print '%s:%s' % (field,fileInfo[field])
#for infoField,infoValue in fileInfo:
# print '%s:%s' % (infoField,infoValue)
if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ): #判斷是否路徑
print 'Directory. '
else:
print 'Non-directory.'
if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ): #判斷是否一般文件
print 'Regular file.'
elif stat.S_ISLNK ( fileStats [ stat.ST_MODe ] ): #判斷是否鏈接文件
print 'Shortcut.'
elif stat.S_ISSOCK ( fileStats [ stat.ST_MODe ] ): #判斷是否套接字文件
print 'Socket.'
elif stat.S_ISFIFO ( fileStats [ stat.ST_MODe ] ): #判斷是否命名管道
print 'Named pipe.'
elif stat.S_ISBLK ( fileStats [ stat.ST_MODe ] ): #判斷是否塊設(shè)備
print 'Block special device.'
elif stat.S_ISCHR ( fileStats [ stat.ST_MODe ] ): #判斷是否字符設(shè)置
print 'Character special device.'
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
import os.path
fileStats = 'test.txt'
if os.path.isdir ( fileStats ): #判斷是否路徑
print 'Directory.'
elif os.path.isfile ( fileStats ): #判斷是否一般文件
print 'File.'
elif os.path.islink ( fileStats ): #判斷是否鏈接文件
print 'Shortcut.'
elif os.path.ismount ( fileStats ): #判斷是否掛接點(diǎn)
print 'Mount point.'
stat模塊描述了os.stat(filename)返回的文件屬性列表中各值的意義。我們可方便地根據(jù)stat模塊存取os.stat()中的值。
5.串行化文件
#!/usr/bin/env python
#-*- encoding:UTF-8 -*-
import pickle
filehandler = open('pickle.txt','w')
text = ['this is a pickle demonstrate','aa','bb']
pickle.dump(text,filehandler) #把text的內(nèi)容序列化后保存到pickle.txt文件中
filehandler.close()
filehandler2 = open('pickle.txt')
textlist = pickle.load(filehandler2) #還原序列化字符串
print textlist
filehandler2.close()
#cpickle是用C寫(xiě)的pickle模塊,比標(biāo)準(zhǔn)的pickle速度快很多,使用方法同pickle。
6.內(nèi)存文件
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import StringIO
fileHandle = StringIO.StringIO ( "Let freedom ring." ) #create file in memory
print fileHandle.read() # "Let freedom ring."
fileHandle.close()
#cStringIO是用C寫(xiě)的StringIO模塊,執(zhí)行速度比StringIO快。
shutil模塊是一個(gè)高級(jí)的文件處理模塊,可實(shí)現(xiàn)文件的拷貝、刪除等操作。
打開(kāi)文件
打開(kāi)文件程序會(huì)調(diào)用內(nèi)置的open函數(shù),首先是外部名,接著就是處理模式。
常見(jiàn)的文件運(yùn)算:
在任何情況下,Python程序中的文本文件采用字符串的形式,讀取文本時(shí)會(huì)返回字符串形式的文本
從文件中讀取的數(shù)據(jù)回到腳本時(shí)是一個(gè)字符串,所以如果字符串不是你所需的,就得將其轉(zhuǎn)換成其他類(lèi)型的Python對(duì)象
實(shí)際應(yīng)用中的文件
首先看一個(gè)文件處理的一個(gè)簡(jiǎn)單的例子:
>>> myfile=open('myfile','w')
>>> myfile.write('hello,myfile!\n')
>>> myfile.close()
>>> myfile=open('myfile')
>>> myfile.readline()
'hello,myfile!\n'
>>> myfile.readline()
''
把一行文本寫(xiě)成字符串,包含行終止符\n,寫(xiě)入方法不會(huì)為我們添加行終止符
在文件中存儲(chǔ)并解析Python對(duì)象
必須使用轉(zhuǎn)換工具把對(duì)象轉(zhuǎn)換成字符串,注意文件數(shù)據(jù)在腳本中一定是字符串,而寫(xiě)入方法不會(huì)自動(dòng)地替我們做任何向字符串格式轉(zhuǎn)換的工作
>>> X,Y,Z=43,324,34
>>> S='Spam'
>>> D={'a':1,'b':2}
>>> L=[1,2,3]
>>> F=open('datafile.txt','w')
>>> F.write(S+'\n')
>>> F.write('%s,%s,%s\n'%(X,Y,Z))
>>> F.write(str(L)+'$'+str(D)+'\n')
>>> F.close()
一旦我們創(chuàng)建了文件愛(ài)你就可以通過(guò)打開(kāi)和讀取字符串來(lái)查看文件的內(nèi)容,而print語(yǔ)句則會(huì)解釋內(nèi)嵌行終止符來(lái)給用戶(hù)滿(mǎn)意的結(jié)果:
>>> bytes=open('datafile.txt').read()
>>> bytes
"Spam\n43,324,34\n[1, 2, 3]${'a': 1, 'b': 2}\n"
>>> print bytes
Spam
43,324,34
[1, 2, 3]${'a': 1, 'b': 2}
鑒于Python不會(huì)自動(dòng)把字符串轉(zhuǎn)換為數(shù)字或其他類(lèi)型的對(duì)象,需要使用諸如索引、加法等普通對(duì)象工具
>>> F=open('datafile.txt')
>>> line=F.readline()
>>> line
'Spam\n'
>>> line=F.readline()
>>> line
'43,324,34\n'
>>> parts=line.split(',')
>>> parts
['43', '324', '34\n']
>>> int(parts[1])
324
>>> numbers=[int(p) for p in parts]
>>> numbers
[43, 324, 34]
>>> line=F.readline()
>>> line
"[1, 2, 3]${'a': 1, 'b': 2}\n"
>>> parts=line.split('$')
>>> parts
['[1, 2, 3]', "{'a': 1, 'b': 2}\n"]
>>> eval(parts[0])
[1, 2, 3]
>>> objects=[eval(p) for p in parts]
>>> objects
[[1, 2, 3], {'a': 1, 'b': 2}]
用pickle存儲(chǔ)Python的原生對(duì)象
使用eval可以把字符串轉(zhuǎn)換成對(duì)象,pickle模塊是能夠讓我們直接在文件中存儲(chǔ)幾乎任何Python對(duì)象的高級(jí)工具,并不要求把字符串轉(zhuǎn)換來(lái)轉(zhuǎn)換去
>>> F=open('datafile.txt','w')
>>> import pickle
>>> pickle.dump(D,F)
>>> F.close()
>>> F=open('datafile.txt')
>>> E=pickle.load(F)
>>> E
{'a': 1, 'b': 2}
pickle模塊執(zhí)行所謂的對(duì)象序列化,也就是對(duì)象和字節(jié)字符串之間的互相轉(zhuǎn)換
相關(guān)文章
python pickle存儲(chǔ)、讀取大數(shù)據(jù)量列表、字典數(shù)據(jù)的方法
pickle模塊實(shí)現(xiàn)了用于序列化和反序列化python對(duì)象結(jié)構(gòu)的二進(jìn)制協(xié)議。這篇文章主要介紹了python pickle存儲(chǔ)、讀取大數(shù)據(jù)量列表、字典的數(shù)據(jù),需要的朋友可以參考下2019-07-07Python 實(shí)現(xiàn) 貪吃蛇大作戰(zhàn) 代碼分享
本文給大家分享的是一個(gè)使用cocos2d-python游戲引擎庫(kù)制作出來(lái)的貪吃蛇大作戰(zhàn)的游戲代碼,基于Python 2.7 和 cocos2d 庫(kù),有需要的小伙伴可以參考下2016-09-09跟老齊學(xué)Python之使用Python操作數(shù)據(jù)庫(kù)(1)
本文詳細(xì)講述了使用python操作數(shù)據(jù)庫(kù)所需要了解的知識(shí)以及準(zhǔn)備工作,十分的詳盡,這里推薦給想學(xué)習(xí)python的小伙伴。2014-11-1113行python代碼實(shí)現(xiàn)對(duì)微信進(jìn)行推送消息的示例代碼
本文主要介紹了13行python代碼實(shí)現(xiàn)對(duì)微信進(jìn)行推送消息的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Pytorch中index_select() 函數(shù)的實(shí)現(xiàn)理解
這篇文章主要介紹了Pytorch中index_select() 函數(shù)的實(shí)現(xiàn)理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11python如何在一個(gè)py文件中獲取另一個(gè)py文件中的值(一個(gè)或多個(gè))
這篇文章主要介紹了python如何在一個(gè)py文件中獲取另一個(gè)py文件中的值(一個(gè)或多個(gè)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08關(guān)于探究python中sys.argv時(shí)遇到的問(wèn)題詳解
這篇文章主要給大家介紹了python里sys.argv時(shí)遇到問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02在spyder IPython console中,運(yùn)行代碼加入?yún)?shù)的實(shí)例
這篇文章主要介紹了在spyder IPython console中,運(yùn)行代碼加入?yún)?shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04