python文件处理
文件是我们储存信息的地方,我们经常要对文件进行读、写、删除等的操作,在Python中,我们可用Python提供的函数和方法方便地操作文件。
9.1. 文件处理的函数和方法
使用Open()函数可打开文件,语法格式如下:
file_handler = open(filename,[,mode[,bufsize]]
filename是你要操作的文件名,如果不在当前路径,需指出具体路径。mode是打开文件的模式,表示你要如何操作文件,bufsize表示是否使用缓存。
Table 9.1. mode
模式 |
描述 |
r |
以读方式打开文件,可读取文件信息。 |
w |
以写方式打开文件,可向文件写入信息。 |
a |
以追加方式打开文件,文件指针自动移到文件尾。 |
r+ |
以读写方式打开文件,可对文件进行读和写操作。 |
w+ |
消除文件内容,然后以读写方式打开文件。 |
a+ |
以读写方式打开文件,并把文件指针移到文件尾。 |
b |
以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。 |
Table 9.2. bufsize
bufsize取值 |
描述 |
0 |
禁用缓冲 |
1 |
行缓冲 |
>1 |
指定缓冲区的大小 |
<1 |
系统默认的缓冲区大小 |
open()函数返回一个文件对象,我们可通过read()或write()函数对文件进行读写操作,下面是一些文件对象方法:
Table 9.3. 文件对象方法
方法 |
描述 |
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中的字符串一行一行地写入文件。 |
9.2. 示例
· 文件的打开或创建
· #!/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()
· 读取文件
· #!/usr/bin/env python
· #-*- encoding:UTF-8 -*-
·
· filehandler = open('test.txt','r') #以读方式打开文件,rb为二进制方式(如图片或可执行文件等)
·
· print 'read() function:' #读取整个文件
· 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个字符,从33个字符开始显示余下内容
· filehandler.seek(32)
· print filehandler.read()
·
· print 'tell() function' #移位到文件头,从头开始显示2位字符
· filehandler.seek(0)
· print filehandler.readline() #显示第一行内容
· print filehandler.tell() #显示当前位置
· print filehandler.readline() #显示第二行内容
· print filehandler.read() #显示余下所有内容
·
· filehandler.close() #关闭文件句柄
· 文件系统操作
· #!/usr/bin/env python
· #-*- encoding:utf-8 -*-
·
· import os,fnmatch,glob
·
· for fileName in os.listdir ( '/root' ): #列出/root目录内容,不包括.和..
· print fileName
·
· os.mkdir('py') #在当前目录下创建一个py目录,且只能创建一层
· os.rmdir( 'py') #在当前目录下删除py目录,且只能删除一层
· os.makedirs('py/aa') #可创建多层目录
· os.removedirs('py/aa') #可删除多层目录
·
·
· print 'demonstration fnmatch module'
· for fileName in os.listdir ( '/root/python/file' ):
· if fnmatch.fnmatch(fileName,'*.txt'): #利用UNIX风格的通配,只显示后缀为txt的文件
· print fileName
·
· print 'demonstration glob module'
· for fileName in glob.glob ( '*.txt' ): #利用UNIX风格的通配,只显示后缀为txt的文件
· print fileName
· 获取文件状态
· #!/usr/bin/env python
· #-*- encoding:UTF-8 -*-
·
· import os,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 fileInfo
·
· for field in fileInfo: #显示对象内容
· 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 ] ): #判断是否块设备
· print 'Block special device.'
· elif stat.S_ISCHR ( fileStats [ stat.ST_MODe ] ): #判断是否字符设置
· 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 ): #判断是否挂接点
· print 'Mount point.'
stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义。我们可方便地根据stat模块存取os.stat()中的值。
· 串行化文件
· #!/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的内容序列化后保存到pickle.txt文件中
·
· filehandler.close()
·
· filehandler2 = open('pickle.txt')
·
· textlist = pickle.load(filehandler2) #还原序列化字符串
· print textlist
·
· filehandler2.close()
·
· #cpickle是用C写的pickle模块,比标准的pickle速度快很多,使用方法同pickle。
· 内存文件
· #!/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写的StringIO模块,执行速度比StringIO快。
shutil模块是一个高级的文件处理模块,可实现文件的拷贝、删除等操作。