12---文件操作2

一。文件操作----控制文件读写内容的两种模式

控制文件读写内容的模式
t:
    1、读写都是以字符串(unicode)为单位
    2、只能针对文本文件
    3、必须指定字符编码,即必须指定encoding参数
b:binary模式
    1、读写都是以bytes为单位
    2、可以针对所有文件
    3、一定不能指定字符编码,即一定不能指定encoding参数

二。b模式

# b模式---文本文件
# rb  只读模式
with open('a','rb') as f:
    res = f.read()
    # 直接将硬盘中的二进制不做任何转换读入内存,在解释器处理过后,会输出一串16进制(字母和数字除外)
    print(res)

# 直接输出文件内容而不是输出一串16进制
with open('a','rb') as f:
    # 需要对res进行解码,以什么格式存就以什么格式取
    res = f.read().decode('utf-8')
    print(res)

# wb 只写模式,必须对写入文件的内容进行编码,否则会报错
with open('a','wb') as f:
    f.write('qqq\n哈哈\n123\n'.encode())

# ab 只追加写,同样必须对写入文件的内容进行编码
with open('a','ab') as f:
    f.write('qqq\n哈哈\n123\n'.encode())
# b模式---图片/视频的复制
with open(r'C:\Users\GuiGui\Desktop\timg.jpg','rb') as f,\
    open(r'C:\Users\GuiGui\Desktop\timg-2.jpg','wb') as f1:
    res = f.read()
    print(res)
    f1.write(res)

三。t模式和b模式的对比

总结:
1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
2、针对非文本文件(如图片、视频、音频等)只能使用b模式

四。循环读取文件的方式

# 方式一---for循环:以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大
# 1/rb模式
with open('a','rb') as f:
    for line in f:
        print(line)
        print(line.decode())
# 2/rt模式
with open('a','r',encoding='utf-8') as f:
    for line in f:
        print(line,end = '')
        print(line.encode('utf-8'))

# 方式二---while循环:自己控制每次加载到内存的数据量
# rb模式
with open('a','rb') as f:
    while True:
        # read()可以指定每次读取的字节数
        res = f.read(1)
        if len(res) == 0:
            break
        print(res)
# rt模式
with open('a','rt',encoding='utf-8') as f:
    while True:
        # read()可以指定每次读取的字符数
        res = f.read(1)
        if len(res) == 0:
            break

五。文件操作的其他方式

  1、读的相关操作

# 1、readline() 一次读一行

#
rt模式 with open('a','r',encoding='utf-8') as f: # res = f.readline() # print(res) while True: line = f.readline() if len(line) == 0: break print(line)

# rb模式 with open('a','rb') as f: # res = f.readline() # print(res) while True: line = f.readline() if len(line) == 0: break print(line) # 2、readlines()将打开的文本文件中的每行内容添加到列表中 # rt模式 with open('a','r',encoding='utf-8') as f: res = f.readlines() print(res) # rb模式 with open('a', 'rb') as f: res = f.readlines() print(res)

# 强调: # f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出 # 如果想将大文件的内容读入内存,建议使用循环读取文件的方法。

  2、写的相关操作

# wt模式
with open('a','w',encoding='utf-8') as f:
    # 需要自己写换行符
    # f.write('111\n222\n')
    # 注意对文本文件的IO操作都是字符串,所以列表中的数字必须是字符串
    l = ['111\n','222\n']
    f.writelines(l)

# wb模式
with open('a','wb') as f:
    # 因为是b模式,所以写入的数据必须是bytes(二进制)类型
    l = [
        '我是汉字\n'.encode('utf-8'),
        '所以要编码成二进制格式\n'.encode('utf-8'),
    ]
    f.writelines(l)
    # 如果是纯数字或者纯英文,可以按照以下格式写,也可以按照汉字的编码方式
    l = [
        b'123\n',
        b'hello\n'
        ]
    f.writelines(l)

  3、flush,会将执行完写操作的文件马上存入硬盘

# 当对一个文件进行写操作的时候,操作系统并不会立刻把写的文件存入硬盘,而是会攒够一定数量一起存入硬盘
# 注意:在文本编辑器上接着之前的内容写,不是追加写,而是对加载到内存的文件进行覆盖
with open('a','w',encoding='utf-8') as f:
    f.write('')
    f.flush()

  4、需要了解的其他操作

f.readable()  # 文件是否可读
f.writable()  # 文件是否可读
f.closed  # 文件是否关闭
f.encoding  # 如果文件打开模式为b,则没有该属性
f.flush()  # 立刻将文件内容从内存刷到硬盘
f.name

六。文件的高级操作---控制文件指针的移动

  1、f.tell()  ----指针当前的位置

  2、控制指针的移动

# 指针的移动都是以字节bytes为单位
    # 例外情况:t模式下的read(n),n是指每次读取几个字符
# with open('a','r',encoding='utf-8') as f:
#     res = f.read(2)
#     print(res)

# 强调:只有0模式可以在t下使用,1、2模式必须在b模式下用

# f.seek(n,模式) n是根据后面的模式移动的字节数
# 0 模式,参照物是文件开头的位置
with open('a','r',encoding='utf-8') as f:
    f.seek(4,0)
    res = f.tell()
    print(res)
# 1 模式,参照物是当前指针所在位置
with open('a','rb') as f:
    print(f.tell())
    f.seek(3,1)
    print(f.tell())
    f.seek(4,1)
    print(f.tell())
# 2 模式,参照物是文件末尾位置,应该倒着移动
with open('a','rb') as f:
    print(f.tell())
    f.seek(0,2)
    print(f.tell())
    f.seek(-3,2)
    print(f.tell())

 

posted @ 2020-03-16 16:44  微信搜索-程序媛小庄  阅读(163)  评论(0编辑  收藏  举报