Logo

郎哥编程

读取文件内容

2020-12-29 105

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

文本文件和二进制文件

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

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

使用read方法读取文件内容

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

content = fileobj.read(size=-1)

read方法的size参数用于指定需要从文件读取的字节数,如果调用read方法时,没有给出size参数(默认值为-1),文件内容会被全部读取。

read会把读取的文件内容存储到content变量,content变量的类型与open函数使用的文件打开模式有关,如果open函数以默认的文本模式打开,content变量为字符串类型,如果以二进制模式打开,content变量为byte类型。

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

# 待打开文件的绝对路径
filename = "d://test.txt"
try:
  #使用r模式打开文本文件,编码方式为utf-8
  fp = open(filename,"r",encoding='utf-8')
  print("%s 文件打开成功" % filename)
  #从文件对象中读取文件内容
  content = fp.read()
  #关闭文件对象
  fp.close();
  print("读取的文件内容:")
  print(content);
except IOError:
  print("文件打开失败,%s文件不存在" % filename)

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

d://test.txt 文件打开成功
课程以浅显易懂的语言,以常见的生活场景为案例,带领大家逐步进入计算机编程世界。
读者打开的文本文件内容可能会和test.txt文本内容不一致。

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

#图片文件绝对路径
filename = "d://sample.jpg"
try:
    #使用r模式打开二进制文件
    fp = open(filename,"r")
    print("%s 文件打开成功" % filename)
    #读取文件内容
    content = fp.read()
    #关闭文件对象
    fp.close();
    print("读取的文件内容:")
    print(content)
except IOError:
    print("文件打开失败,%s文件不存在" % filename)

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

d://sample.jpg 文件打开成功
Traceback (most recent call last):
  File "D:/Python/11.py", line 8, in <module>
    content = fp.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence

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

#图片文件绝对路径
filename = "d://sample.jpg"
try:
    #使用r模式打开二进制文件
    fp = open(filename,"rb")
    print("%s 文件打开成功" % filename)
    #读取文件内容
    content = fp.read()
    #关闭文件对象
    fp.close();
    print("读取的文件内容:")
    print(content)
except IOError:
    print("文件打开失败,%s文件不存在" % filename)

使用‘rb’模式可以正确打开二进制文件,read方法会以字节流方式读取文件内容,content为bytes数据类型的对象,使用print方法输出content时,会输出字节信息。输出结果如下所示,因字节信息内容过长,列出部分内容。

d://sample.jpg 文件打开成功

读取的文件内容:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xdb\x00C\x00\x08\x05\x06\x07\x06\x0

 使用readline方法读取文件内容

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

content = fileobj.readline(size=-1)

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

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

#使用文本文件初始化列表
list = []
filename = "d://sample.txt"
try:
    #使用r模式打开文本文件
    fp = open(filename,"r",encoding='utf-8')
    print("%s 文件打开成功" % filename)
    done = False
    #使用while循环读取文本文件所有行数
    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结束循环,若不为空将读取的文本行添加到列表中。

程序执行结果如下所示:

d://sample.txt 文件打开成功
['朝辞白帝彩云间,\n', '千里江陵一日还。\n', '两岸猿声啼不住,\n', '轻舟已过万重山。']

readline和readlines的区别

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

#使用文本文件初始化列表
list = [];
filename = "d://sample.txt"
try:
    fp = open(filename,"r",encoding='utf-8')
    print("%s 文件打开成功" % filename)
    #fp.readlines()返回字符串列表对象
    for line in fp.readlines():
        list.append(line)
    #关闭文件对象
    fp.close()
    print(list)
except IOError:
    print("文件打开失败,%s文件不存在" % filename)

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

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

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

评论区

登录 后发表评论
暂无评论