• 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

  • 相关阅读:
    P1351 联合权值
    c++ 贪心讲解大礼包
    取石子 找规律
    树 dfs暴力判环 题意转化
    P2519 [HAOI2011]problem a
    P1640 [SCOI2010]连续攻击游戏 二分图最大匹配 匈牙利算法
    P2756 飞行员配对方案问题 二分图匹配 匈牙利算法
    cogs 49. 跳马问题 DFS dp
    cogs 2. 旅行计划 dijkstra+打印路径小技巧
    cogs 1440. [NOIP2013]积木大赛 贪心水题
  • 原文地址:https://www.cnblogs.com/pw20180101/p/8298374.html
Copyright © 2020-2023  润新知