文件是我们储存信息的地方,我们经常要对文件进行读、写、删除等的操作,在Python中,我们可用Python提供的函数和方法方便地操作文件。文件可以通过调用open或file来打开,open通常比file更通用,因为file几乎都是为面向对象程序设计量身打造
本文地址:http://www.cnblogs.com/archimedes/p/python-file.html,转载请注明源地址。
文件处理的函数和方法
使用Open()函数可打开文件,语法格式如下:
file_handler = open(filename,[,mode[,bufsize]]
filename是你要操作的文件名,如果不在当前路径,需指出具体路径。mode是打开文件的模式,表示你要如何操作文件,bufsize表示是否使用缓存。
mode
模式描述r
以读方式打开文件,可读取文件信息。
w
以写方式打开文件,可向文件写入信息。
a
以追加方式打开文件,文件指针自动移到文件尾。
r+
以读写方式打开文件,可对文件进行读和写操作。
w+
消除文件内容,然后以读写方式打开文件。
a+
以读写方式打开文件,并把文件指针移到文件尾。
b
以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。
bufsize
bufsize取值描述0
禁用缓冲
1
行缓冲
>1
指定缓冲区的大小
<1
系统默认的缓冲区大小
open()函数返回一个文件对象,我们可通过read()或write()函数对文件进行读写操作,下面是一些文件对象方法:
文件对象方法
方法描述f.close()
关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。
f.fileno()
获得文件描述符
f.flush()
刷新输出缓存
f.isatty()
如果文件是一个交互终端,则返回True,否则返回False。
f.read([count])
读出文件,如果有count,则读出count个字节。
f.readline()
读出一行信息。
f.readlines()
读出所有行,也就是读出整个文件的信息。
f.seek(offset[,where])
把文件指针移动到相对于where的offset位置。offset为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。
f.tell()
获得文件指针位置。
f.truncate([size])
截取文件,使文件的大小为size。
f.write(string)
把string字符串写入文件。
f.writelines(list)
把list中的字符串一行一行地写入文件。
示例1.文件的打开或创建
#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler= open('test.txt','w')#以写模式打开文件,如果文件不存在则创建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')#以追加模式打开文件,如果文件不存在则创建filehandler.write('\nappend the text in another line.\n')
filehandler.close()
2.读取文件
#!/usr/bin/env python#-*- encoding:UTF-8 -*-filehandler= open('test.txt','r')#以读方式打开文件,rb为二进制方式(如图片或可执行文件等)PRint'read() function:'#读取整个文件printfilehandler.read()print'readline() function:'#返回文件头,读取一行filehandler.seek(0)printfilehandler.readline()print'readlines() function:'#返回文件头,返回所有行的列表filehandler.seek(0)printfilehandler.readlines()print'list all lines'#返回文件头,显示所有行filehandler.seek(0)
textlist=filehandler.readlines()forlineintextlist:printlineprint'seek() function'#移位到第32个字符,从33个字符开始显示余下内容filehandler.seek(32)printfilehandler.read()print'tell() function'#移位到文件头,从头开始显示2位字符filehandler.seek(0)printfilehandler.readline()#显示第一行内容printfilehandler.tell()#显示当前位置printfilehandler.readline()#显示第二行内容printfilehandler.read()#显示余下所有内容filehandler.close()#关闭文件句柄
3.文件系统操作
#!/usr/bin/env python#-*- encoding:utf-8 -*-importos,fnmatch,globforfileNameinos.listdir ('/root'):#列出/root目录内容,不包括.和..printfileName
os.mkdir('py')#在当前目录下创建一个py目录,且只能创建一层os.rmdir('py')#在当前目录下删除py目录,且只能删除一层os.makedirs('py/aa')#可创建多层目录os.removedirs('py/aa')#可删除多层目录print'demonstration fnmatch module'forfileNameinos.listdir ('/root/python/file'):iffnmatch.fnmatch(fileName,'*.txt'):#利用UNIX风格的通配,只显示后缀为txt的文件printfileNameprint'demonstration glob module'forfileNameinglob.glob ('*.txt'):#利用UNIX风格的通配,只显示后缀为txt的文件printfileName
4.获取文件状态
#!/usr/bin/env python#-*- encoding:UTF-8 -*-importos,time,stat
fileStats= os.stat ('test.txt')#获取文件/目录的状态fileInfo ={'Size':fileStats [ stat.ST_SIZE ],#获取文件大小'LastModified':time.ctime( fileStats [ stat.ST_MTIME ] ),#获取文件最后修改时间'Lastaccessed':time.ctime( fileStats [ stat.ST_ATIME ] ),#获取文件最后访问时间'CreationTime':time.ctime( fileStats [ stat.ST_CTIME ] ),#获取文件创建时间'Mode':fileStats [ stat.ST_MODE ]#获取文件的模式}#print fileInfoforfieldinfileInfo:#显示对象内容print'%s:%s'%(field,fileInfo[field])#for infoField,infoValue in fileInfo:#print '%s:%s' % (infoField,infoValue)ifstat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):#判断是否路径print'Directory.'else:print'Non-directory.'ifstat.S_ISREG ( fileStats [ stat.ST_MODE ] ):#判断是否一般文件print'Regular file.'elifstat.S_ISLNK ( fileStats [ stat.ST_MODe ] ):#判断是否链接文件print'Shortcut.'elifstat.S_ISSOCK ( fileStats [ stat.ST_MODe ] ):#判断是否套接字文件print'Socket.'elifstat.S_ISFIFO ( fileStats [ stat.ST_MODe ] ):#判断是否命名管道print'Named pipe.'elifstat.S_ISBLK ( fileStats [ stat.ST_MODe ] ):#判断是否块设备print'Block special device.'elifstat.S_ISCHR ( fileStats [ stat.ST_MODe ] ):#判断是否字符设置print'Character special device.'#!/usr/bin/env python#-*- encoding:UTF-8 -*-importos.path
fileStats='test.txt'ifos.path.isdir ( fileStats ):#判断是否路径print'Directory.'elifos.path.isfile ( fileStats ):#判断是否一般文件print'File.'elifos.path.islink ( fileStats ):#判断是否链接文件print'Shortcut.'elifos.path.ismount ( fileStats ):#判断是否挂接点print'Mount point.'
stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义。我们可方便地根据stat模块存取os.stat()中的值。
5.串行化文件
#!/usr/bin/env python#-*- encoding:UTF-8 -*-importpickle
filehandler= open('pickle.txt','w')
text= ['this is a pickle demonstrate','aa','bb']
pickle.dump(text,filehandler)#把text的内容序列化后保存到pickle.txt文件中filehandler.close()
filehandler2= open('pickle.txt')
textlist= pickle.load(filehandler2)#还原序列化字符串printtextlist
filehandler2.close()#cpickle是用C写的pickle模块,比标准的pickle速度快很多,使用方法同pickle。
6.内存文件
#!/usr/bin/env python#-*- coding: utf-8 -*-importStringIO
fileHandle= StringIO.StringIO ("Let freedom ring.")#create file in memoryprintfileHandle.read()#"Let freedom ring."fileHandle.close()#cStringIO是用C写的StringIO模块,执行速度比StringIO快。
shutil模块是一个高级的文件处理模块,可实现文件的拷贝、删除等操作。
打开文件打开文件程序会调用内置的open函数,首先是外部名,接着就是处理模式。
常见的文件运算:
在任何情况下,Python程序中的文本文件采用字符串的形式,读取文本时会返回字符串形式的文本
从文件中读取的数据回到脚本时是一个字符串,所以如果字符串不是你所需的,就得将其转换成其他类型的Python对象
实际应用中的文件首先看一个文件处理的一个简单的例子:
>>> myfile=open('myfile','w')>>> myfile.write('hello,myfile!\n')>>>myfile.close()>>> myfile=open('myfile')>>>myfile.readline()'hello,myfile!\n'>>>myfile.readline()''
把一行文本写成字符串,包含行终止符\n,写入方法不会为我们添加行终止符
在文件中存储并解析Python对象必须使用转换工具把对象转换成字符串,注意文件数据在脚本中一定是字符串,而写入方法不会自动地替我们做任何向字符串格式转换的工作
>>> 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()
一旦我们创建了文件爱你就可以通过打开和读取字符串来查看文件的内容,而print语句则会解释内嵌行终止符来给用户满意的结果:
>>> bytes=open('datafile.txt').read()>>>bytes"Spam\n43,324,34\n[1, 2, 3]${'a': 1, 'b': 2}\n">>>printbytes
Spam43,324,34[1, 2, 3]${'a': 1,'b': 2}
鉴于Python不会自动把字符串转换为数字或其他类型的对象,需要使用诸如索引、加法等普通对象工具
>>> 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)forpinparts]>>>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)forpinparts]>>>objects
[[1, 2, 3], {'a': 1,'b': 2}]
用pickle存储Python的原生对象使用eval可以把字符串转换成对象,pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,并不要求把字符串转换来转换去
>>> F=open('datafile.txt','w')>>>importpickle>>>pickle.dump(D,F)>>>F.close()>>> F=open('datafile.txt')>>> E=pickle.load(F)>>>E
{'a': 1,'b': 2}
pickle模块执行所谓的对象序列化,也就是对象和字节字符串之间的互相转换