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

时间:2023-03-09 04:01:46
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\n") '写入文件abcde\n,因为换行\n占两个字符,故共写入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\nf,即文件的内容为:abcde\nf

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

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\r\n’)

#把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中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ ‘\n’ ‘\r\n’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式
字符的后面,还可以加上+ 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()函数来实现遍历的。