顽石自雕

导航

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() -读取文件的所有内容到内存,并按照每一行进行分割,然后加入到列表中(每个元素尾部均含有\n)。适用于小文件!!

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

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

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

  • 5种读取方式同上。

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

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

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

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

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

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\try\log.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() -读取文件的所有内容到内存,并按照每一行进行分割,然后加入到列表中(每个元素尾部均含有\n)。适用于小文件!!
# ps:文件每行尾部的\n去不掉。会存在于list中的每个元素尾部。
# 写在前面:若要读取的文件很大,则全部读取到内存后,会撑爆内存。
file_object = open('log.txt', encoding='utf-8', mode='r')
content_list = file_object.readlines()
print(content_list)  # 返回一个列表,列表中的每个元素是源文件的每一行。
file_object.close()
# 结果:['吕布是暖男\n', '吕布是暖男\n', '吕布是暖男\n', '吕布是暖男\n', '吕布是暖男\n']

# 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'\xe5\x90\x95\xe5\xb8\x83\r\n' # 这是用十六进制表示的二进制。

# 题外话:二进制-->str
# 要想看(人类可识别)一下读取的内容到底是什么,就需要将字符串的bytes类型(二进制)-->str:解码。
# 示例:
content_b = b'\xe5\x90\x95\xe5\xb8\x83\r\n'
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('吕布是个小暖男\n')
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\n' % (item['name'], item['password'], )  # \n可以拼接在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()   # 去掉每一行中两边的换行符\n(虽然我们看不见,但只要文件中的内容换行了,
    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()  # 去掉每一行中两边的换行符\n(虽然我们看不见,但只要文件中的内容换行了,则每一行末尾肯定隐藏有换行符的。)
content_list = content.split('\n')  # 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\n', '妥妥|456\n']

posted on 2019-06-17 23:58  insensate_stone  阅读(186)  评论(0编辑  收藏  举报