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')