• python的文件操作file:(内置函数,如seek、truncate函数)


    file打开文件有两种方式,函数用file()或者open()。打开后读入文件的内容用read()函数,其读入是从文件当前指针位置开始,所以需要控制指针位置用:

      

    一、先介绍下file读入的控制函数:

    seek(offset,where): where=0从起始位置移动,1从当前位置移动,2从结束位置移动。当有换行时,会被换行截断。seek()无返回值,故值为None。

    # 将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了where参数就不一定了, where可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
                seek()的三种模式:

    (1)f.seek(p,0) 移动当文件第p个字节处,绝对位置

    (2)f.seek(p,1) 移动到相对于当前位置之后的p个字节

    (3)f.seek(p,2) 移动到相对文章尾之后的p个字节

    for instance:

        inputfile= file('g:\observer_report_20130915155111')
        #for line in filecontent.readline():
        #print inputfile.readline()
        #print inputfile.tell()
        #print inputfile.seek(0,0)
        #print inputfile.tell() 

    tell(): 返回文件的当前位置,即文件指针当前位置,以文件开头为原点,受seek、readline、read、readlines影响,不受truncate影响

    truncate(n): 从文件的首行首字符开始截断,截断文件为n个字符;无n表示从当前位置起截断;截断之后n后面的所有字符被删除。其中win下的换行代表2个字符大小。

      注意:truncate()这个函数跟文件指针位置无关。每次执行都是从文件开始处执行,也就是seek(0,0)的位置开始,截取指定参数的n个字符,其它的全部删除。所以要用a+(a不行)或是r+。如果用w+模式会读出空,因为w是先删除再写,一定不要用。执行结果为,只剩文件开头的n个字符。

    read()读入所有行内容

    readline(n):n为空时读入一行,默认读入当前行,开始读取的位置为tell()+1。n为一行中读入的字节数,不满一行的就取出部分(当前行的前n个字符),超出一行的只读一行。

    readlines()读入所有行内容,按行读入,读入的内容为一行行。

    另外,注意,新python,加入两个函数xreadline()和xreadlines(),其将读入的行作为类似列表的独立对象,返回的行可以独立按对象进行相关操作。

      

    二、以下以1个例子说明以上各个函数的作用

    fso = open("f:\a.txt",'w+') '以w+方式,并非a方式打开文件,故文件原内容被清空
    print fso.tell() '文件原内容被清空,故此时tell()=0

    fso.write("abcde ") '写入文件abcde ,因为换行 占两个字符,故共写入7个字符
    print fso.tell() '此时tell()=7

    fso.write("fghwm") '又写入文件fghwm,故此时文件共写入7+5 =12个字符
    print fso.tell() '此时tell()=12

    fso.seek(1, 0) '从起始位置即文件首行首字符开始移动1个字符
    print fso.tell() ‘此时tell() =1

    print fso.readline() '读取当前行,即文件的第1行,但是从第二个字符(tell()+1)开始读,结果为:bcde。

    '若换成for读取整个文件或read读取整个文件则结为bcdefghwm
    print fso.tell() ‘因为readline此时tell() =7,

    fso.truncate(8) '从写入后文件的首行首字符开始阶段,截断为8个字符,即abcde f,即文件的内容为:abcde f

    print fso.tell() ‘tell() 依旧为7,并为受truncate(8)影响,但是此时文件内容为abcde f

    print fso.readline() ‘从tell()+1=8开始读取,读取当前行内容:f

    fso.close()

    #打开文件和进行写操作
    f=open(‘test.txt’,'w’)
    f.write(‘hello’)
    f.writelines(['hi','haha'])#多行输入
    f.close()
    #append data
    f=open(‘test.txt’,'a’)
    f.write(‘hello’)
    f.writelines(['hi','haha'])
    f.close()
    #连续写入后会自动关闭
    open(‘test.txt’,'a’).write(‘11111 ’)
    #把result里的元素依次填到open函数里去
    result={‘hello’,'u’}
    exec open(‘test.txt’) in result
    #
    selected = [] # temp list to hold matches
    fp = open(‘test.txt’)
    for line in fp.readlines(): # Py2.2 -> “for line in fp:”
    selected.append(line)
    del line # Cleanup transient variable
    #
    open(‘test.txt’).readlines()

    file在python是一个特殊的类型,用于外部文件的操作。python中一切都是对象,file也不例外,file有file的方法和属性。

    创建一个file对象:* file(name[, mode[, buffering]])

    file()函数:创建一个file对象,它有一个别名叫open(),更形象一些,它们是内置函数。参数是以字符串的形式传递的。

    name是文件的名字。

    mode 是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如 在 unix中是一个 ,而在windows中是‘ ’,用U模式打开文件,就是支持所有的换行模式,也就说‘ ’ ‘ ’ ‘ ’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用 代替。在模式 字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。

    buffering如果为0表示不缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。

    filfile的属性主要有:

    * closed #标记文件是否已经关闭,由close()改写
    * encoding #文件编码
    * mode #打开模式
    * name #文件名
    * newlines #文件中用到的换行模式,是一个tuple
    * softspace #boolean型,一般为0,据说用于print

    file的其他方法:

    * F.close()
    #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
    * F.flush()
    #把缓冲区的内容写入硬盘
    * F.fileno()
    #返回一个长整型的”文件标签“
    * F.isatty()
    #文件是否是一个终端设备文件(unix系统中的)
    * F.next()
    #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。

  • 相关阅读:
    公司到底是怎么看我们的……[转]
    C# String.Format 的使用[转]
    Oracle9I 在安装时出现[登台区出现问题,请确保指定有效的“源”和“目标”!]
    街机游戏下载
    C#操作Excel时直接引用Com和InteropExcel的差异
    我所理解的接口和抽象类[转]
    c# winFrom 使窗体显示SplitContainer或Panel中[转]
    SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
    Solaris大半年使用感触
    solaris上的pkg管理
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205656.html
Copyright © 2020-2023  润新知