Python的open文件的读取方式有以下几种方法:
read([size]):读取文件,如果传了size参数,则读取size字节,否则读取全部
readline([size]):读取一行
readlines([size]):读取完文件,返回文件每一行所组成的列表
例:
假如我有一个blogCblog.txt文件,文件内容为:
blogCblog
blog1Cblog
blog2Cblog
用read来读取一下
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.read() #用read()方法读取文件内容 3 print fr #打印所读取到的内容 4 5 #打印结果: 6 #blogCblog 7 #blog1Cblog 8 #blog2Cblog
上面可以看到,用read()方法读取到的文件内容是和我们本来blogCblog.txt里面的内容是一样的,也就是read()方法没有传入size参数时是默认读取全部的。
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.read(4) #用read()方法读取文件4个字节的内容 3 print fr #打印所读取到的内容 4 5 #打印结果:blog
上面可以看到read() 方法传入了一个参数‘4’,也就是读取文件内容的4个字节,通过打印可以看到,确实是读取到了4个字节的内容‘blog’。如果你传入的参数(size)大于文件的大小,那么就会返回文件的全部内容。
现在用readline()来读取一下,还是那个文件:
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.readline() #用readline()方法读取文件的一行内容 3 print fr #打印所读取到的内容 4 5 #打印结果:blogCblog
上面可以看到用readline()方法读取文件的一行的内容,确实是读取到了blogCblog这一行内容,接着来看下传入了size参数的readline():
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.readline(4) #用readline()方法读取文件的一行中的4字节内容内容 3 print fr #打印所读取到的内容 4 5 #打印结果:blog
上面的结果跟read(4)的结果是一样的,那是不是就没有区别了呢,其实不然,区别大大的,我们来再加一行 f.readline(4):(如果传入的参数(size)大于行的大小,就会返回整行)
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.readline(4) #用readline()方法读取文件的一行中的4字节内容内容 3 fr = f.readline(4) #再添加一行f.readline(4) 4 print fr #打印所读取到的内容 5 6 #打印结果:Cblo
上面的代码第三行添加再添加了一行 f.readline(4),打印结果为Cblog。我们来再添加几行一行 f.readline(4)来看下:
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.readline(4) #用readline()方法读取文件的一行中的4字节内容内容 3 fr = f.readline(4) #再添加一行f.readline(4) 4 fr1 = f.readline(4) 5 fr2 = f.readline(4) 6 fr3 = f.readline(4) 7 print fr, fr1, fr2, fr3 #打印所读取到的内容 8 9 #打印结果:Cblo g 10 # blog 1Cbl
上面的代码第4、5、6行分别添加了一行 f.readline(4),并分别赋值给fr1、fr2、fr3,打印结果为:fr为Cblo、fr1为g、fr2为blog、fr3为1Cbl,从中可以看出readline()传入参数后是读取所传的字节数,当再次执行readline(4)的时候会从上次读取的位置开始读取,直到这行读取完毕,当当前行读取完毕再次使用readline(4)时会从下行开始,同样的readline()没有传参时是一样的,也就是读取文件的一行,当再次使用readline()时,读取第二行。
接着来看下readlines()的读取:
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.readlines() #用readlines()方法读取文件 3 print fr #打印所读取到的内容 4 5 #打印结果:[‘blogCblog\n‘, ‘blog1Cblog\n‘, ‘blog2Cblog‘]
上面结果确实是文件内容所组成的list,接着来看readlines()传入参数(size),会怎样:
1 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 2 fr = f.readlines(4) #用readlines()方法读取文件,传入4,读取4个字节 3 print fr #打印所读取到的内容 4 5 6 #打印结果:[‘blogCblog\n‘, ‘blog1Cblog\n‘, ‘blog2Cblog‘]
咦?不是读取4个字节吗,怎么返回的还是list?跟想象的不同喔!其实readlins()的size跟read(),readline()的size是有区别的,readlines()的size是Python定义的sizehint,通过io.DEFAULT_BUFFER_SIZE可以知道Python定义的sizehint的大小,为了验证,把blogCblog.txt文件里面的内容改为1万行blogCblog,下面来看代码:
1 import io 2 print io.DEFAULT_BUFFER_SIZE 3 4 f = open(‘blogCblog.txt‘) #首先先创建一个文件对象 5 fr = f.readlines(8192) #用readlines()方法读取文件,传入8192,读取4个字节 6 print len(fr) #打印所读取到的内容长度 7 8 9 #打印结果:8192 10 # 820
上面可以看到Python定义的sizehint的大小为8192字节,同时用readlines传入8192,并赋值给fr变量,再打印出fr的长度,fr为820(也就是820条blogCblog),也可以计算一下是否正确:blogCblog.txt文件里blogCblog为10个字节(包括\n),820*10=8200(字节),咦,不是读取8192字节吗,怎么读取了8200个字节呢,原来,当读取到820行的时候,还没有读完,只读到bl,因为是读行,所以会自动把第820行读完整。
注:操作完文件之后,记得要用close()方法关闭文件