3.1文件操作(files)
Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作
3.1.1打开文件
3.1.1.1 open()
Python内置了一个打开文件的函数open(),用来打开一个文件,创建一个file对象,然后你就可以对该打开的文件做任何你想做的操作
fp=open(file_name[,access_mode][,buffering]):file_name变量是一个包含了你要访问的文件路径及文件名称的字符串值,access_mode:决定了打开文件的模式,是只读、写入、追加等等。这是个非强制参数,默认文件访问模式为只读(r);buffering也是一个非强制性参数,如果buffering的值被设置为0,就不会有缓存;如果值为1,访问文件时会有缓存行;如果值为大于1的整数,表明了这就是寄存区的缓冲大小,如果取负数值,寄存区的缓存大小则为系统默认。
如果以只读(r)模式打开一个不存在的文件,会报IOError异常,如果是以写或者追加模式打开一个不存在的文件,默认会创建该文件,如果所在路径中有目录不存在,也会报IOError异常
代码示例:在d盘目录下打开/创建一个newfile.txt文本文件,并写入goodmorning,然后关闭文件
>>> fp=open("d:\newfile.txt","w") #以写的方式打开文件
>>> fp.write("goodmorning") #写入内容
>>> fp.close() 关闭文件#
>>>
执行结果:
代码示例2:将刚刚写入的文件内容读取出来
>>> fp=open("d:\newfile.txt","r") #以只读的方式打开文件
>>> print fp.readline() #读出内容
goodmorning
>>> fp.close() #关闭文件
>>>
3.1.1.2 with open(file_name[,access_mode])
with open(file_name[,access_mode]):与open用法基本一致,区别在于用with方法打开文件,会默认关闭文件
>>> with open("d:\newfile.txt") as fp:
... for line in fp:
... print line
...
goodmorning
3.1.2 文件操作模式
r:只读,文件的指针会放在文件的开头,从开头开始读取文件内容,这是文件的默认打开方式
w:覆盖式写入,如果文件存在,则将文件中的全部内容清空然后写入,如果文件不存在,创建文件
a:追加式写入,从文件的末尾开始写入,如果文件不存在,创建文件
文件对象:一个文件被打开后,你就会得到一个file对象,然后就可以得到有关该文件的各种信息。
>>> fp=open("d:\newfile.txt","r")
>>> fp.closed #如果文件已经关闭,返回TRUE,否则返回False
False
>>> fp.mode #返回被打开文件的访问模式
'r'
>>> fp.name #返回文件的名称
'd:\newfile.txt'
>>> fp.softspace #末尾是否强制加空格
0
>>> fp.close()
>>> fp.closed
True
>>>
3.1.3 文件常用操作方法
3.1.3.1 fp.read([size])
fp.read([size]):size为读取的长度,以byte为单位,如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个” ”符号
>>> fp=open("d:\newfile.txt","r")
>>> content=fp.read(5)
>>> print content
goodm
>>> fp.close()
>>>
3.1.3.2 fp.readline([size])
fp.readline([size]):只读取一行,size为读取的长度,以byte为单位,如果给定了size,有可能返回的只是一行的一部分,如果不指定参数,表示一次性读取一行,以字符串形式返回,结尾会有一个” ”符号,读完一行,文件操作标记移动到下一行的开头,下次读取时,从下一行的开头开始
示例:按行读取,每读取一行,都会有一个/n符号
>>> fp=open("d:\newfile.txt","r")
>>> for i in range(3):
... a=fp.readline()
... print a
...
goodmornin
my name is pangwei
one two three fore five six
>>> fp.close()
>>>
示例:按长度读取,一行读完之后/n符号会独占一行,之后会再换一行
>>> fp=open("d:\newfile.txt","r")
>>> for i in range(4):
... a=fp.readline(5)
... print a
...
goodm
ornin
my na
>>> fp.close()
>>>
3.1.3.3 fp.readlines([size])
fp.readlines([size]):把文件的每一行作为一个list的元素,是一个结尾有 的字符串,如果指定了size参数,表示读取文件指定内容的长度,此时就有可能只能读取文件的一部分
>>> fp=open("d:\newfile.txt","r")
>>> a=fp.readlines()
>>> print a
['goodmornin ', 'my name is pangwei ', 'one two three fore five six']
>>> for i in a:
... print i
...
goodmornin
my name is pangwei
one two three fore five six
>>>
3.1.3.4 fp.write(str)
fp.write(str):把str写入到文件中,默认是不加换行符的,换行需要手动加入换行符” ”.
>>> fp=open("d:\newfile.txt","w")
>>> fp.write("pangwei is a sunny big boy"+" ")
>>> fp.close()
>>>
fp.writelines(seq):把序列seq的内容全部写入到文件中(多行一次性写入)。不会自动加入换行符;注意:seq中的内容也必须是字符串类型的数据,才能成功写入文件
>>> seq=["pangwei ","is ","a ","boy ","测试文件"]
>>> fp=open("d:\newfile.txt","w")
>>> fp.writelines(seq)
>>> fp.close()
>>>
fp.close():文件对象的close()方法刷新缓冲区里任何还没有写入的信息,并关闭该文件。用close关闭文件是一个很好的习惯,文件关闭之后不能再对文件进行操作,但是如果文件不及时关闭,有可能产生句柄泄露,丢失数据
fp.flush():此函数将缓冲区中的内容写入硬盘
fp.next():返回文件的下一行内容,并将文件操作标记位移动到下一行,把一个文件(flie)用for i in file这样的循环遍历语句时,就是调用next()函数来实现。
>>> fp=open("d:\newfile.txt","r")
>>> fp.next()
'pangwei '
>>> fp.next()
'is '
>>> fp.close()
>>>
fp.tell():返回文件操作标记的当前位置,以文件开头为基准点
>>> fp=open("d:\newfile.txt","r")
>>> fp.tell()
0L
>>> fp.readline()
'pangwei '
>>> fp.tell()
9L
>>> fp.readline()
'is '
>>> fp.tell()
13L
>>>fp.close()
>>>
fp.seek(offset[,from]):这是一个文件定位函数,该方法改变当前文件的位置。offset变量表示要移动的字节数,from遍历指定开始移动字节的参考位置。如果from被设置为0(默认值),意味着将文件开头作为移动字节的参考位置;1表示使用当前位置作为参考位置;2表示使用文件的末尾作为参考位置。注意:如果使用a或者a+的模式打开文件,文件的标记会自动返回到文件末尾
>>> fp=open("d:\newfile.txt","r")
>>> fp.readline()
'pangwei '
>>> fp.seek(0,0)
>>> fp.readline()
'pangwei '
>>> fp.readline()
'is '
>>> fp.close()
>>>
fp.truncate([size]):把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置,如果size比文件的大小还要大,根据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
>>> fp=open("d:\newfile.txt","r+")
>>> fp.readline() #读出了文件第一行的内容
'pangwei '
>>> fp.truncate() #从当前位置(第二行开头)开始裁,后边的内容全部裁掉了
>>> fp.readline() #读取到后边的内容为空
''
>>> fp.close()
>>>
3.1.3 linecache模块
linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。
linecache.getlines(file_name):读出文件中所有的行,输出为列表格式,每一行作为一个元素,以linenum-1为元素索引位置存储
代码示例1:绝对路径读取文件内容
>>> import linecache
>>> linecache.getlines("d:\newfile.txt")
['pangwei ', ' ', 'pangwei is a boy ', 'hello world! ']
代码示例2:相对路径读取文件内容
>>> import linecache
>>> import os
>>> os.chdir("d:\")
>>> os.getcwd()
'd:\'
>>> linecache.getlines("newfile.txt")
['pangwei ', ' ', 'pangwei is a boy ', 'hello world! ']
>>>
linecache.getline(file_name,lineno):读出文件中第lineno行;这个函数不会抛出异常,如果产生错误,他将返回’’(换行符将会包含在找到的行里)
>>> import linecache
>>> linecache.getline("newfile.txt",5)
''
>>> linecache.getline("newfile.txt",4)
'hello world! '
>>>
linecache.clearcache([file_name]):清除缓存,file_name是一个非强制参数,表示清除指定文件的缓存
linecache.checkcache([file_name]):检查缓存的有效性,如果在缓存中的文件在硬盘上发生了变化,并且你需要更新版本,是一个非强制参数,不传递此参数,将检查缓存里的所有条目
linecache.updatecache([file_name]):更新缓存,如果file_name文件更新了,使用这个函数可以更新linecache.getlines(file_name)返回的列表,如果出错,则返回空列表
练习:删除文件中的空行
#encoding=utf-8
import os
def DelBlankLine(infile,outfile):
infp=open(infile, "r")
outfp=open(outfile, "w")
lines =infp.readlines()
for i in lines:
if i==' ': #不同操作系统下换行符可能会有不同
print u"此行是空行"
if i.split(): #去除纯空格或者其他不可见字符的行
outfp.write(i)
infp.close()
outfp.close()
#print DelBlankLine("d:\newfile.txt","d:\newfile1.txt")
3.1.4 cPickle模块(序列化)
Python提供一个标准的模块,称为pickle,cPickle模块的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快的多(cPickle比pickle快1000倍);使用它可以在一个文件中存储任何Python对象,比如列表,字典等,之后你又可以把它完整无缺的取出来,这被称为持久的存储对象(序列化)
#encoding=utf-8
import cPickle as p
shoplist=["apple","banner","mango"]
fp=open("d:\python\shoplist.txt","w")
p.dump(shoplist,fp) #将列表对象dump到文件中
fp.close()
fpout=open("d:\python\shoplist.txt","r")
storedlist=p.load(fpout) #从文件中取出之前的列表
print u"从文件中读取的列表对象:",storedlist