9、bytes类型,文件处理

一、bytes类型

  x = "上"

  priint([x,])

#             编码                     编码
# 字符-------------------->unicode------------->其他编码
# 
#             解码                      解码
# 字符<--------------------unicode<-------------其他编码

  Python encode() 方法以 encoding 指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。

  

  Python decode() 方法以 encoding 指定的编码格式解码字符串。默认编码为字符串编码。

 

print(x)
res = x.encode("gbk")
print(type(res))

#强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换
print(res)
print(res.decode("gbk"))

 

二、文件处理

  控制文件读写操作的模式:

  r:只读(默认的)

  w:只写

  a:只追加

  控制文件读写内容的模式:

  t:控制读写的内容都是字符串类型(默认的)

    特点:

      1、只适用于文腾文件

      2、一定要指定encoding参数

  b:控制读写的内存都是bytes类型

      1、适用于所有文件(都是转为二进制字节)

      2、一定不要指定encoding参数

  r(只读):如果文件不存在则会报错,文件存在则会将文件指针跳到整个文件的开头

  

f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close()

  w(只写):如果文件不存在则会创建新的空文档,如果文件存在则会清空,文件指针跳到文件开头

  

f = open(r'b.txt',mode='wt',encoding='utf-8')
f.write("你好啊1\n")
f.write("你好啊2\n")  # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
f.write("你好啊3\n")

f.close()

  a(只追加):如果文件不存在则会创建空文档,如果文件存在则会清空,文件指针跳到文件夹末尾

  

f = open(r'c.txt',mode='at',encoding='utf-8')
f.write("你好啊1\n")
f.write("你好啊2\n")  # 打开了文件不关闭的情况下,新写入的内容永远跟在老内容之后
f.write("你好啊3\n")
f.close()

  读写模式

  r+t

  w+t

  a+t

  例如:

  

f = open(r'c.txt',mode='r+t',encoding='utf-8')
# print(f.readable())
# print(f.writable())
# print(f.read())

f.write("h")
f.close()

  b模式

  

with open('c.txt',mode='rb') as f:
    res = f.read()
    # print(type(res))
    # print(res)
    print(res.decode('utf-8'))




with open('1.mp4',mode='rb') as f:
    print(f.read())
    for line in f:
        print(line)

 三、文件操作方法

    readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理,如果碰到结束符 EOF 则返回空字符串。

    readline() 方法用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。

with open('a.txt',mode='rt',encoding='utf-8') as f:
     res = f.read()
     print(res)
     print('=========================')
     res = f.read()
     print(res)

     print(f.readline())

     res = f.readlines()
     print(res)
        pass

    

    writelines() 方法用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要制定换行符 \n

with open('a.txt',mode='wt',encoding='utf-8') as f:
     f.write("1111\n222\n333\n")

    lines = ['aaa\n',"bbbb\n","cccc\n"]
     for line in lines:
         f.write(line)

     f.writelines(lines)
     f.writelines("hello")

    补充:

with open('a.txt', mode='wt', encoding='utf-8') as f:
    f.write("hello")  # 在a。txt里面写文件
    f.flush()  # flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,\n
    # 同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
    print(f.closed)  # 判断a.txt这个文件是否关闭--此时没有关闭
    print(f.name)  # 查看当前编辑的文件名

print(f.closed)  # 判断当前的文件是否关闭--此时关闭

四、被动控制文件指针移动

  只有t模式下的read(n)的n代表的是字符个数,除此以外都是字节个数

  

with open('a.txt',mode='rt',encoding='utf-8') as f:
res = f.read(6)
print(res)


with open('a.txt',mode='rb') as f:
res = f.read(8)
print(res.decode('utf-8'))

with open('a.txt',mode='at',encoding='utf-8') as f:
f.truncate(6)
#truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,
无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除,
其中 Widnows 系统下的换行代表2个字节大小

五、主动控制指针移动

  f.seek(移动的字节个数,模式)

  模式有三种:

  0:永远参照文件开头

  1:参照当前所在的位置

  2:永远参照文件末尾

  #注意:只有0模式可以在t下使用,1和2只能在b模式下使用

with open('a.txt',mode='rt',encoding='utf-8') as f:
    f.seek(3,0)
    f.seek(5,0)
    print(f.tell())

with open('a.txt',mode='rb') as f:
    f.seek(3,1)
    f.seek(5,1)
    print(f.tell())
    res=f.read()
    print(res.decode('utf-8'))

with open('a.txt',mode='rb') as f:
f.seek(-3,2)
print(f.tell())
f.seek(0,2)

六、修改文件的方法

  修改文件的方式一:

  1、先将文件的内容全部读入内存中

  2、在内存中完成修改

  3、将修改后的内容覆盖回原文件

  ps:耗费内存不耗费硬盘**所以学习运维的要注意,大的日志文件不要直接操作

with open('e.txt', mode="rt", encoding='utf-8') as f:
    data = f.read()

with open('e.txt',mode='wt',encoding='utf-8') as f1:
    f1.write(data.replace('egon','EGON'))

  修改文件的方式二:

  1、以读的方式打开原文件,然后以写的方式打开另一个临时文件

  2、读原文件的一行内容到内存,然后再内存中修改完毕后再写入临时文件,循环往复直到全部改完

  3、删除原文件,将临时文件重命名为原文件名

  ps:耗费硬盘不耗费内存

import os

with open('e.txt',mode='rt',encoding='utf-8') as src_f,\n
open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f: for line in src_f: dst_f.write(line.replace('EGON','egon')) os.remove('e.txt') os.rename('.e.txt.swp','e.txt')

 

posted @ 2020-12-25 15:14  BaiM0  阅读(514)  评论(0编辑  收藏  举报