zoukankan      html  css  js  c++  java
  • 05-python基础语法_4.文件操作

    4-1-4 文件操作 -6种打开模式:r/rb/w/wb/a/ab。

    (一).Outline

    1.文件操作的初识

    1.1文件操作的三步
    1.2格式
    1.3报错

    2-1.文件操作的读(文字):r模式 -只读,读取出来是str。 **

    • 2.1read() -全读: 读取文件的所有内容到内存。适用于小文件!!******

    • 2.2read(字符个数) -从当前光标所在的位置向后读取两个字符。不常用。

    • 2.3readlines() -读取文件的所有内容到内存,并按照每一行进行分割,然后加入到列表中(每个元素尾部均含有 )。适用于小文件!!

    • 2.4readline() -只读第一行。

    • 2.5对文件操作对象进行for循环读取 -一行一行的读。适用于读取大文件。小文件亦可。不会撑爆内存。******

    2-2.文件操作的读(图片/视频/音频/未知编码):rb模式 -只读,读取出来的是二进制数据。 **

    • 5种读取方式同上。

    3-1.文件操作的写(文字):w模式- 只清空写入,写入的是str。**

    • 3.1 w模式 :只写 -先清空再写入。一般用于新建文件!!

    • 3.2 方式一:只写一次。**

    • 3.3 方式二:写两次 -两次写到一行里。

    • 3.4 方式三:写两次 -两次写到两行里(加 )。**

    3-2.文件操作的写(图片/视频/音频/未知编码):wb模式- 只清空写入,写入的是二进制。**

    4-1.文件操作的追加(文字) :a模式- 只追加写入str。**

    • 4.1 a模式:只追加写。

    4-2.文件操作的追加(图片/视频/音频/未知编码) :ab模式- 只追加写入二进制。**

    5-1.文件操作的其他模式(文字):r+/w+/a+模式- 可读可写str(不常用)

    • 5.1 r+ :可只读/只写/读+写 # 写时会覆盖原有内容。

    • 5.2 w+: 先清空写入再读取

    • 5.3 a+: 先追加写入再读

    5-2.文件操作的其他模式(图片/视频/音频/未知编码):r+b/w+b/a+b模式- 可读可写二进制(不常用)

    6.文件操作的其他功能。

    7.打开文件的另一种方式

    8.文件操作的改 ***

    9.练习题

    (二).Content

    1.文件操作的初识

    1.1文件操作的三步:
    • 1th:打开文件。

    • 2th:对file_object进行相应操作

    • 3th:关闭文件。一定记得关闭!!!否则只是写入内存,并没有将写的内容强制刷新到硬盘。(相当于没保存) :若不关闭,会占用一定的内存空间。

    1.2格式:
    # 写在前面:
    # 如果要操作的文件与该py文件在同一个目录下(即在同一个文件夹里),则file_object不用写文件路径。
    # 如果要操作的文件与该py文件不在同一个目录下(即不在一个文件夹里),则file_object需要写文件路径。
    
    file_object = open('e:/log.txt', encoding='utf-8', mode='r')  # log.txt存在硬盘:utf-8.
    content = file_object.read()   # py文件将文件加载到内存进行计算:utf-8 --> unicode.
    print(content)
    file_object.close()
    
    • 诠释:

      open:是python的内置函数,open底层调用的是操作系统的接口
      file_object:变量,文件操作的对象对文件进行的任何操作,都得通过file_object来进行
      encoding:可以不写,若不写,则默认编码本为:操作系统的默认编码

      • windows: gbk
      • linux: utf-8
      • mac : utf-8

      file_object.close()关闭文件操作对象。
      mode:模式。后面可以是r(读)/w(写)/a(追加)/r+(读并追加)等模式

    1.3报错:2个错误。

    ps-1文件存储文件打开时编码本必须一致。否则报错。

    ps-2:当要操作的文件与py文件不在同一个目录下时,若文件路径很多,则可能会产生路径分隔符的问题(在最前面加个r即可):

    r'e:Users	rylog.txt'
    

    2-1.文件操作的读(文字) r模式:只读,读取出来是str。**

    # 写在前面:r(read)模式:只读。
    # 5种读取方式:read()/read(字符数目)/readline()/readlines()/对文件对象进行for循环读取(最常用)。
    
    # 1.read() -全读:读取文件的所有内容到内存。适用于小文件!!
    # 写在前面:若要读取的文件很大,则全部读取到内存后,会撑爆内存。
    file_object = open('log.txt', encoding='utf-8', mode='r')
    content = file_object.read()  # 全部读取到内存
    print(content)
    file_object.close()
    
    # 2.read(字符个数) -从当前光标所在的位置向后读取两个字符。不常用。
    # ps:rb模式下的read(字节个数)。-2者莫混淆。
    file_object = open('log.txt', encoding='utf-8', mode='r')
    content = file_object.read(2)  # 从当前光标所在的位置向后读几个字符。
    print(content)
    file_object.close()
    
    file_object = open('log.txt', encoding='utf-8',mode='r')
    file_object.seek(6)  # 将光标从当前位置后移6个字节。
    content = file_object.read(3)  # 从光标位置往后读3个字符。
    print(content)
    file_object.close()
    
    # 3.readlines() -读取文件的所有内容到内存,并按照每一行进行分割,然后加入到列表中(每个元素尾部均含有
    )。适用于小文件!!
    # ps:文件每行尾部的
    去不掉。会存在于list中的每个元素尾部。
    # 写在前面:若要读取的文件很大,则全部读取到内存后,会撑爆内存。
    file_object = open('log.txt', encoding='utf-8', mode='r')
    content_list = file_object.readlines()
    print(content_list)  # 返回一个列表,列表中的每个元素是源文件的每一行。
    file_object.close()
    # 结果:['吕布是暖男
    ', '吕布是暖男
    ', '吕布是暖男
    ', '吕布是暖男
    ', '吕布是暖男
    ']
    
    # 4.readline() -只读第一行。
    file_object = open('log.txt', encoding='utf-8', mode='r')
    content = file_object.readline()
    print(content)   # 只读源文件的第一行。
    print(content)   # 再读一次,也是读源文件的第一行。只不过读了2次而已。
    file_object.close()
    
    # 5.对文件操作对象进行for循环读取 -适用于读取大文件。小文件亦可。***
    # 写在前面:相比read()/readlines(),for循环file_object的优点是:若要读取的文件很大,则它是一行一行的读取到内存。不会担心文件太大而撑爆内存的问题。
    file_object = open('log.txt', encoding='utf-8', mode='r')
    for line in file_object:  # 一行一行的读,不用担心撑爆内存。
        line = line.strip()  # 去除每行后面隐藏的/n。
        print(line)
    file_object.close()
    # 结果:
    吕布是暖男
    吕布是暖男
    吕布是暖男
    吕布是暖男
    吕布是暖男
    # 写在后面:1.记得for循环读取时,去掉换行符!2.此种读取方式是5种中用的最多的一种。
    

    2-2.文件操作的读(图片/视频/音频/未知编码) rb:只读,读取出来是二进制。**

    # (一).文件操作的读 -两种读取方式对比。
    # 1.r模式 -一般用于文字的读取。
    # 写在前面:r模式下 -计算机内部帮我们进行了编码转换工作。不用我们自己再去将读取的二进制转为str。比较便捷。
    
    file_object = open('a.txt',encoding='utf-8',mode='r')
    # r模式下,计算机内部进行的2步操作:  
    # 1th:读取硬盘上0101101010
    # 2th:将 0101101010 按照encoding指定的编码,转换成str。
    content = file_object.read()  # r:读取出来的是str类型。
    file_object.close()
    
    # 2.rb模式 -一般用于图片/视频/音频/未知编码内容的读取。b-binary二进制。
    # 写在前面:rb模式代表:在读取文件前,计算机不再对即将读取的内容根据编码本进行转换,而是直接将二进制读取出来。即读取出来的是原生数据。
    # ps:读取出来的数据实际是二进制(0b开头),只不过是用十六进制(x开头)来表示而已。因为用十六进制表示比较简洁。
    
    # 示例1:rb模式-读取str
    file_object = open('a.txt',mode='rb')
    content_b = file_object.read()  # rb:读取出来的是str的bytes类型(二进制原生数据).
    file_object.close()
    print(content_b)
    # 结果:b'xe5x90x95xe5xb8x83
    ' # 这是用十六进制表示的二进制。
    
    # 题外话:二进制-->str
    # 要想看(人类可识别)一下读取的内容到底是什么,就需要将字符串的bytes类型(二进制)-->str:解码。
    # 示例:
    content_b = b'xe5x90x95xe5xb8x83
    '
    data = content_b.decode('utf-8')  # 见到不认识的,就解码。
    print(data)                       # 因为str硬盘存储用的是utf-8/gbk,故此时尝试用utf-8解码。
    # 结果:吕布
    
    # 示例2:rb模式-读取图片
    file_object = open('01.png', mode='rb')
    content_b = file_object.read()  # rb:读取出来的是二进制(原生数据)。
    file_object.close()
    print(content_b)
    # 结果:多的吓人的二进制数据(表现形式是:十六进制)。
    

    3-1.文件操作的写(文字) w模式: 只写 -先清空再写入str。一般用于新建文件!!**

    # 写在前面:w(write)模式:只写。一般用于新建文件!!
    # 若文件存在:则先清空再写入。(使用需谨慎!)
    # 若文件不存在,则会新建一个文件再写入。(经常这么用。)
    
    # 方式一:只写一次。
    file_object = open('e:/log3.txt', encoding='utf-8', mode='w')
    content = file_object.write('吕布')
    print(content)  # 打印看到的是写入字符的数目。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    # 方式二:写两次 -两次写到一行里。
    file_object = open('log.txt', encoding='utf-8', mode='w')
    file_object.write('吕布是个小暖男')
    file_object.write('貂蝉非常喜欢他')
    file_object.flush()  # 习惯性保存。
    file_object.close()
    # 写入结果:吕布是个小暖男貂蝉非常喜欢他
    
    # 方式三:写两次 -两次写到两行里。
    file_object = open('log.txt', encoding='utf-8', mode='w')
    file_object.write('吕布是个小暖男
    ')
    file_object.write('貂蝉非常喜欢他')
    file_object.flush()  # 习惯性保存。
    file_object.close()
    # 写入结果:
    吕布是个小暖男
    貂蝉非常喜欢他
    

    3-2.文件操作的写(图片/音频/视频/未知编码) wb模式: 只写 -先清空再写入二进制。**

    # ps:需要在写入文件前先获取到写入内容的二进制数据。

    # 用途:下载图片/视频(爬虫),网络传输。

    # (一).文件操作的写 -两种写入方式对比。
    # 1.w模式 -一般用于文字的写入。
    # 写在前面:w模式下 -计算机内部帮我们进行了编码转换工作。不用我们自己再去转为二进制。比较便捷。
    
    file_object = open('a.txt',encoding='utf-8',mode='w')
    # w模式下,计算机内部进行的2步操作:  
    # 1th:将'吕布'根据encoding指定的编码转换成二进制:
           '吕布' --> 10010001 10010010 10010011 10001000 10010001 11010001
    # 2th:再将二进制写入文件中。
    file_object.write('吕布')  # w:write传的值是str。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    # 2.wb模式 -一般用于图片/视频/音频/未知编码内容的写入。b-binary二进制。
    # 写在前面:wb模式代表:在写入文件前,不再对即将写入的内容根据编码本进行转换,而是直接将(写入内容的)二进制写入文件中。
    # ps:需要我们在写入文件前先获取到写入内容的二进制。
    
    # 示例1:wb模式-写入str。
    file_object = open('a.txt',mode='wb')
    # wb模式下,我们自己人为进行的2步操作:
    # 1th:获取写入内容的二进制:str-->二进制(bytes类型)。
    # 写在前面:str硬盘存储/传输:utf-8/gbk。str在内存中是以Unicode编码存储的(位数相同,方便计算)。
    # 因为现在要将str写入硬盘并保存,故应将str的编码方式转为utf-8/gbk。而str的encode方法的作用是:将用Unicode编码的字符串转换成utf-8/gbk编码的字符串,以用来进行str的数据传输/将其保存至硬盘。(即encode的作用是用来进行str编码方式的转换的。),故此时该用encode。
    data = '吕布'  # 见到认识的才编码。
    content_b = data.encode('utf-8')  # 利用str的encode方法将str按照utf-8编码转换成二进制(bytes).
    # 2th:再将二进制写入文件中。
    file_object.write(content_b)  # wb:write传的值是写入内容的二进制。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    # (二).wb模式 示例2:写入图片/视频。
    # 写在前面:ascii/unicode/utf-8/gbk是文字与二进制的对应关系。图片/视频/音频/其他编码的文件,若用文字与二进制的对应关系打开,则会是乱码。
    # wb模式适用场景:当写入的内容是图片/视频/音频/未知编码的文件时。
    # eg:1.去网上爬别人的图片/视频,不知道别人是用什么编码写的这个图片。这时候就用wb模式直接将爬下来的图片/视频的二进制写入文件,即不再做任何的编码转换。(它是什么编码,就用什么编码存 -不再指定编码去打开它,因为根本不知道别人用的什么编码写的)。
    # eg:2.当别人给你网络传输过来一个压缩包.zip文件时,你不知道里面是啥,更不知道里面内容是用哪种编码写入的。故此时不能再用w模式对其指定编码本打开,而是只能用wb模式直接将文件的二进制写入文件。(它是什么编码,就用什么编码存。(虽然不知道它到底是什么编码-不用深究,直接拿过来将二进制写进去就好了,不要再做任何的编码转换))。
    
    # 示例2:下载图片并保存至e盘。(eg:去网上爬图片/视频,保存至本地)
    # 写在前面:需要先装上pip3.
    import requests
    # 1th:获取写入内容的二进制:
    r1 = requests.get('图片的URL')  # 通过python代码发送请求:去网上下载这张图片。
    # print(r1.content)  # 该图片的二进制数据。
    # 2th:将二进制写入文件中。
    file_object = open('1.jpg',mode='wb')
    file_object.write(r1.content)  # wb:write传的值是写入内容的二进制。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    

    4-1.文件操作的追加(文字) a模式: 只追加写入str。**

    # 写在前面: a(append)模式:追加写入str(不能读)
    # 若文件存在:是在文件尾部追加写入。
    # 若文件不存在,则会新建一个文件再写入。
    
    file_object = open('e:/log4.txt', encoding='utf-8', mode='a')
    content = file_object.write('xiaoxiao')  # 在文件内容的最后面追加str。
    print(content)
    file_object.flush()  # 习惯性保存。
    file_object.close()
    

    4-2.文件操作的追加(图片/视频/音频/未知编码) ab:只追加写入二进制。**

    # 写在前面: ab模式:在文件内容的最后面追加写入二进制(不能读)
    # 若文件存在:是在文件尾部追加写入。
    # 若文件不存在,则会新建一个文件再写入。
    
    # ps:需要在写入前,获取到写入内容的二进制。
    file_object = open('e:/log4.txt', mode='a')
    # 1th:获取写入内容的二进制:利用str的encode方法将'吕布'转换成二进制。
    data = '吕布'
    content_b = data.encode('utf-8')  # 将str按照utf-8编码转换成二进制。
    # 2th:再将二进制写入文件中。
    file_object.write(content_b)  # ab:write传的值是写入内容的二进制。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    

    5-1.文件操作的其他模式(文字) r+/w+/a+模式: 可读可写str。 (不常用)

    • r+ 可只读/只写/读+写 # 写时会覆盖原有内容。
    # 写在前面: r+模式:可只读/可只写/可读+写。
    # 若文件存在:是在光标位置写入。
    # 若文件不存在,则会新建一个文件再写入。
    # ps:只能先读再写。不能先写再读。顺序不能错。
    
    # 写在前面:r模式,读:光标默认在文件最左边开始读。写:在光标位置写入,可以通过seek调整光标位置。
    # (1).读:光标默认在最左边。故从文件最左边开始读。ps:可以通过seek调整光标位置,再读取。
    # (2).写:在光标位置写入:
    # 1.先读再写:读完后,光标位于文件尾部。此时是在文件尾部写入。
    # 2.不读只写: 
    # Case1.光标默认在文件开头(最左边)。故是在开头写入,会将光标后的内容覆盖(覆盖程度由写入内容的多少来决定)。
    # Case2.通过seek来调整光标位置。若光标后面有文字,则写入后亦会将其覆盖。
    # 关于seek:
    # 格式:file_object.seek(3) # 写在file_object.write('内容')前面,用于调整写入位置。
    # 含义:seek(3)代表将光标从最左边(文件开头)往后移动3个字节。若seek后的字节数与utf-8/gbk的字节对应关系不匹配(把字劈开了),则会出现乱码。
    
    # 只读:
    file_object = open('e:/try.txt', encoding='utf-8', mode='r+')
    content = file_object.read()
    print(content)
    file_object.close()
    
    # 先读再写:
    file_object = open('e:/try_again.txt', encoding='utf-8', mode='r+')
    content = file_object.read()  # 读完后,光标位于文件尾部。
    print(content)  
    file_object.write('吕布')  # 在尾部写入。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    # 只写:在光标位置写入。会将光标后的内容覆盖。
    # Case1:不用seek调整光标位置。则光标默认在文件开头(最左边)。
    file_object = open('e:/try_again.txt', encoding='utf-8', mode='r+')
    file_object.write('吕布')  # 在文件的开头写入。会将光标后的内容覆盖(覆盖程度由写入内容的多少来决定)。
    file_object.flush()  # 习惯性保存。
    file_object.close()
    # Case2:用seek调整光标位置。
    file_object = open('e:/try_again.txt', encoding='utf-8', mode='r+')
    file_object.seek(3)  # utf-8代表:将光标从最开始的位置移动到1个中文字符(3个字节)后。再写。
    file_object.write('吕布')
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    • w+ 先清空写入再读取
    # 写在前面:w+模式:先清空写入再读取。
    
    # 写在前面:w模式,读:光标默认在文件尾部(因为是先清空再写入)开始读,必须通过seek调整光标位置才能读到。
    # 写:先清空再写入;
    # 读:因为光标默认在文件尾部,故读取时需要先将光标位置调整到文件开头(最左边)。 seek(0)。
    
    file_object = open('e:/try_again.txt', encoding='utf-8', mode='w+')
    file_object.write('貂蝉在哪里')  # 先清空再写入。
    file_object.seek(0)  # 读之前先将光标位置调整到文件最左边。
    content = file_object.read()
    print(content)
    file_object.close()
    
    • a+ 先追加写入再读
    # 写在前面:a+模式:先追加写入再读。
    
    # 写在前面:a模式,读:光标默认在文件尾部开始读,必须通过seek调整光标位置才能读取到内容。
    # 写:无论是否调整光标位置,均是在文件尾部写入;
    # 读:因为a模式默认光标位置在文件最后。而读又是在光标位置开始读取。
    # 故,读取时需要先将光标位置调整到文件开头(最左边)再读。 seek(0)。
    
    file_object = open('e:/try_again.txt', encoding='utf-8', mode='a+')
    file_object.write('貂蝉在哪里')  # 在文件尾部写入。
    file_object.seek(0)  # 读之前先将光标位置调整到文件最左边。
    content = file_object.read()
    print(content)
    file_object.close()
    

    5-2.文件操作的其他模式 r+b/w+b/a+b模式: 可读可写二进制。 (不常用)

    同上

    6.文件操作的其他功能

    # r/rb/w/wb/a/ab/r+/w+/a+/r+b/w+b/a+b模式下的功能有:read() read(字节数目) readline() readlines() write()。
    # 另外补充3个:
    # 写在前面:tell和seek一般用来进行下载文件时的断点续传。
    # tell 获取光标的位置。单位:字节。
    f = open('log.txt', encoding='utf-8',mode='r')
    print(f.tell())  # 0
    content = f.read()
    print(content)  # 吕布睡着了
    print(f.tell())  # 15(字节)
    f.close()
    
    # seek 调整光标的位置。单位:字节。
    f = open('log.txt', encoding='utf-8', mode='r')
    f.seek(3)  # r模式默认光标在文件最左边,f.seek(3)代表将光标后移3个字节,再读。
    content = f.read()
    print(content)  # 布睡着了
    f.close()
    
    # flush 强制刷新,用在w模式的末尾。
    # 即:将内存中的数据强制刷新到硬盘中。相当于文件的ctrl+s保存。
    f = open('log.txt', encoding='utf-8',mode='w')
    f.write('今天是2019年的某一天')
    f.flush()  # 相当于文件的ctrl+s。
    f.close()
    # 写在最后:pycharm会自动保存,flush用处不大。但若用其他不会自动保存的IDE写代码,一定记得w模式的最后写上flush。
    

    7.打开文件的另一种方式

    # 优点1: 不用手动关闭文件句柄。   
    # 它会在一定时间内自动关闭文件操作对象(but:不是立即关闭->会占用一会内存)。
    # with open('log.txt',encoding='utf-8',mode='r') as file_object:  
    #     print(file_object.read())
    # 代码解释:打开('文件的读',encoding='utf-8'),将其作为文件操作对象。
    
    # 优点2:这种打开方式可以用一个with语句 同时对多个文件操作对象进行相应操作。
    with open('log.txt', encoding='utf-8', mode='r') as f1,
            open('log2.txt', encoding='utf-8', mode='w')as f2:
        # 对文件操作对象进行相应的操作:
        print(f1.read())  
        f2.write('吕布handsome')
    
    # 缺点:后补。
    

    8.文件操作的改 ***

    • 文件操作改的流程:5步。
      1, 以的模式打开原文件
      2,以的模式创建一个新文件
      3,将原文件的内容读出来修改成新内容,并写入新文件
      4,将原文件删除
      5,将新文件重命名成原文件
    • 具体代码
    # 示例:将e盘里的log.txt文件中的吕布全部换成MrLin。
    
    # low版(适用于小文件): 用read全读取到内存,若文件很大,则可能会撑爆内存。
    import os
    with open('e:/log.txt', encoding='utf-8', mode='r') as f1,
        open('e:/log2.txt', encoding='utf-8', mode='w') as f2:
        # 3th:将原文件的内容读出来修改成新内容,并写入新文件。
        old_content = f1.read()  # r模式读出来的是str。
        new_content = old_content.replace('吕布', 'MrLin')
        f2.write(new_content)
    os.remove('e:/log.txt')
    os.rename('e:/log2.txt', 'e:/log.txt')
    
    
    # 进阶版(大/小文件均适用):一行一行的读。不会担心撑爆内存的问题。
    import os
    with open('e:/log.txt', encoding='utf-8', mode='r') as f1,
        open('e:/log2.txt', encoding='utf-8', mode='w') as f2:
        # 3th:将原文件的内容读出来修改成新内容,并写入新文件。
        for line in f1:  # r模式下,不管以何种方式度,读出来的都是str。
            new_line = line.replace('吕布', 'MrLin')   # 一行一行的读,不会撑爆内存。
            f2.write(new_line)
    os.remove('e:/log.txt')
    os.rename('e:/log2.txt', 'e:/log.txt')
    
    或者: # 需要手动关闭。
    f1 = open('e:/log.txt', encoding='utf-8', mode='r')
    f2 = open('e:/log2.txt', encoding='utf-8', mode='w')
    for line in f1:
        new_line = line.replace('吕布', 'MrLin')
        f2.write(new_line)
    f1.close()
    f2.close()  # 记得关闭!不然浪费内存。
    

    9.练习题

    • 练习1:
    # 1.请将user = ['吕布', '妥妥']中的元素根据_连接,并写入’practice.txt’的文件。
    user = ['吕布', '妥妥']
    content = '_'.join(user)
    file_object = open('practice.txt', encoding='utf-8', mode='w')
    file_object.write(content)
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    • 练习2:
    # 2.请将列表user元素中的每个字典的值,用管道符|连接,并分行写入’practice.txt’文件。
    user = [
        {'name': '吕布', 'password': 123},
        {'name': '妥妥', 'password': 456},
    ]
    写入文件后,形如:
    '吕布'|123
    '妥妥'|456
    
    user = [
        {'name': '吕布', 'password': '123'},
        {'name': '妥妥', 'password': '456'},
    ]
    file_object = open('practice.txt', encoding='utf-8', mode='w')  # w是先清空再写,故应放在外面。
    for item in user:
        template_line = '%s|%s
    ' % (item['name'], item['password'], )  # 
    可以拼接在str模板里.
        content = file_object.write(template_line)
        print(content)
    file_object.flush()  # 习惯性保存。
    file_object.close()
    
    • 练习3
    # 3.(承接练习2)请将practice.txt中的文件读取出来并添加到一个列表中,形如:['吕布|123', '妥妥|456']。
    
    # 方法一:用for循环文件对象,一行一行的读。
    result = []
    file_object = open('practice.txt', encoding='utf-8', mode='r')
    for line in file_object:
        line = line.strip()   # 去掉每一行中两边的换行符
    (虽然我们看不见,但只要文件中的内容换行了,
        result.append(line)   # 则每一行末尾肯定隐藏有换行符的。)
    file_object.close()  # 一定记得关闭文件操作对象。
    print(result)
    
    # 方法二:用read全部读取到内存。
    file_object = open('practice.txt', encoding='utf-8', mode='r')
    content = file_object.read()
    file_object.close()
    content = content.strip()  # 去掉每一行中两边的换行符
    (虽然我们看不见,但只要文件中的内容换行了,则每一行末尾肯定隐藏有换行符的。)
    content_list = content.split('
    ')  # str.split('分隔符')后的结果是个列表。
    print(content_list)
    
    # 错误示例:用readlines()读取,每行的换行符去不掉。因为readlines内部机制是将文件每行读取后自动加入list中,根本没机会去掉文件每行末尾隐藏的换行符。
    file_object = open('practice.txt', encoding='utf-8', mode='r')
    line_list = file_object.readlines()  # readlines()是将文件内容按行读取出来,并加入列表中。
    file_object.close()                  # 列表中的每个元素是源文件的每一行。
    print(line_list)
    # 结果:['吕布|123
    ', '妥妥|456
    ']
    
  • 相关阅读:
    Spring5源码分析(011)——IoC篇之解析bean标签总览
    Spring5源码分析(010)——IoC篇之加载BeanDefinition:解析和注册BeanDefinition
    Spring5源码分析(009)——IoC篇之加载BeanDefinition:获取 Document 实例
    Spring Boot2(015):JSON
    Spring Boot2(014):国际化 Internationalization
    Spring Boot2(013):日志
    Spring Boot2(012):Profiles
    Spring Boot2(011):外部化配置 Externalized Configuration
    Spring5源码分析(008)——IoC篇之加载BeanDefinition:获取XML的验证模式
    ubuntu 16.04下ssh访问提示错误
  • 原文地址:https://www.cnblogs.com/wanshizidiao/p/11042914.html
Copyright © 2011-2022 走看看