Logo

郎哥编程

使用read方法读取文件内容

2018-12-07 1024

使用open函数可以打开文件并返回一个文件对象,返回的文件对象用来读取和写入文件内容。那么,如何使用文件对象来读取文件内容呢?如何让读取的文件内容初始化一个Python列表呢?


1、文本文件和二进制文件


使用文件对象读取文件内容时,要根据文件的不同存储类型选择不同的读取方式。一般来说,文件的存储类型主要分为文本文件和二进制文件两大类。文本文件就是可以用记事本打开的文件,文本文件主要存储了文字信息及换行符等控制符号,任何程序都可以打开文本文件并能正确显示文件内容;二进制文件主要是以二进制方式来存储内容,二进制文件很难被用户或其它程序理解,读取后也无法正确显示,只有创建它的程序才能够正确读取和显示,如DOC文档、图片文件、音视频等文件。

文件对象提供了三种读取文件内容的方法,分别是read、readline、readlines。其中read方法即可以读取文本文件也可以读取二级制文件,readline和readlines方法只能读取文本文件。下面分别予以说明。


2、使用read方法读取文件内容


read方法按字节读取文件内容,可以设定读取的字节数,read语法如下:

content = fileobj.read(size=-1);

read方法的size参数用于指定需要从文件读取的字节数,如果调用read方法时,没有给出size参数(默认值为-1),文件内容会被全部读取。read会把读取的文件内容存储到content变量,content变量的类型与open函数使用的文件打开模式有关,如果open函数以默认的文本模式打开,content变量为字符串类型,如果以二进制模式打开,content变量为byte类型。

例1:使用r模式打开并读取文本内容。

#使用r模式打开文本文件
filename = "d://test.txt";
try:
    fp = open(filename,"r");
    print("%s 文件打开成功" % filename);
    content = fp.read();
    fp.close();
    print("读取的文件内容:");
    print(content);
except IOError:
    print("文件打开失败,%s文件不存在" % filename);

open函数以文本r模式打开文本文件,打开成功后返回文件对象并赋值给fp,fp调用read方法读取全部文件内容,读取的文件内容存储到content字符串变量,读取文件结束后,需要调用close方法关闭文件。最后使用print函数输出content存储的文件内容。程序输出结果如下图所示。

image.png                                             

例2:使用r模式打开并读取二进制文件。

#使用r模式打开二进制文件
filename = "d://spring.png";
try:
    fp = open(filename,"r");
    print("%s 文件打开成功" % filename);
    content = fp.read();
fp.close();
    print("读取的文件内容:");
    print(content);
except IOError:
    print("文件打开失败,%s文件不存在" % filename);

open函数以文本r模式打开二进制文件spring.png图片文件时,会出现错误。这是因为当open函数以文本方式打开二进制文件时,read方法在读取文件内容时,会将读取的字符编码通过UnicodeDecode解码器进行解码,但文件内容并没有进行字符编码,因此报解码错误。错误描述如下图所示。

image.png

打开二进制文件的正确方式是使用‘rb’、‘rb+’等二进制打开模式。下面的代码是打开二进制文件的正确方式。

#打开二进制文件
filename = "d://spring.png";
try:
    fp = open(filename,"rb");
    print("%s 文件打开成功" % filename);
    content = fp.read();
fp.close();
    print("读取的文件内容:");
    print(content);
except IOError:
    print("文件打开失败,%s文件不存在" % filename);

使用‘rb’模式可以正确打开二进制文件,read方法会以字节流方式读取文件内容,content为byte数据类型的变量,使用print方法输出content时,会输出字节信息。输出结果如下图所示,因字节信息内容过长,截图不完整。

image.png


3、 使用readline和方法读取文件内容


readline只适合读取文本文件,它用于顺序读取文本文件的一行(读取下个行结束符之前的所有字符),读取的内容作为字符串返回。readline语法如下:

content = fileobj.readline(size=-1);

readline方法的size参数同read方法相同,也是用于指定需要从文件读取的字节数,默认值为-1,表示读至每行的结束符。如果设定了读取的字节数,readline读取size个字节后,可能会返回不完整的行。readline比较适合读取较大的文本文件,这些文件不适合一次性读入,而是边读取边处理文件。

例3:使用文本文件初始化列表。

#使用文本文件初始化列表
list = [];
filename = "d://test.txt";
try:
    fp = open(filename,"r");
    print("%s 文件打开成功" % filename);
    done = False;
    while not done:
        aline = fp.readline();
        if(aline != ""):
            list.append(aline);
        else:
            done = True;
fp.close();
    print(list);
except IOError:
    print("文件打开失败,%s文件不存在" % filename);

Python列表可以使用文本文件内容来初始化。具体方法是将列表内容存储到文本文件中,每一行作为一个列表元素。程序打开文件后,使用readline方法顺序读取文本行,每读取一行文本就将该文本加入到列表中。代码设置了布尔变量done,用于标记文件是否读取结束,初始值为False,当文件读取结束后赋值为True。读取文件的过程采用循环语句,在循环过程中调用readline方法读取文本行,并判断读取的文本行是否为空,如果为空说明已经读取到文件的结尾,将布尔变量done赋值为True结束循环,若不为空将读取的文本行添加到列表中。程序输出结果如下图所示。

image.png


4、  readline和readlines的区别


readline和readlines的语法基本相同,但功能上有所区别。readlines会读取文件中的所有文本行,并返回一个字符串列表,适合于读取较小的文本文件。使用readlines方法可以简化例3的代码。

#使用文本文件初始化列表
list = [];
filename = "d://test.txt";
try:
    fp = open(filename,"r");
    print("%s 文件打开成功" % filename);
    for line in fp.readlines():
        list.append(line);
fp.close();
    print(list);
except IOError:
    print("文件打开失败,%s文件不存在" % filename);

因为readlines会读取文件中的所有文本行,因此不再需要设置一个布尔变量用于标记文件是否读取完成。同时readlines读取完成后返回一个字符串列表,对字符串列表的处理可以使用for …… in…… 语句进行处理。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论