Python(2.7)-文件操作(file)

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提供一个标准的模块,称为picklecPickle模块的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快的多(cPicklepickle1000倍);使用它可以在一个文件中存储任何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

原文地址:https://www.cnblogs.com/pw20180101/p/8298374.html