05 python开发之文件处理
- 05 python开发之文件处理
-
5 文件处理
-
5.1 字符编码
- 5.1.1 基本概念
- 5.1.2 发展历程
- 5.1.3 使用
-
5.2 文件处理基础
- 5.2.1 基本概念
- 5.2.2 操作文件的步骤
- 5.2.3 with上下文管理
-
5.3 文件打开模式
- 5.3.1 控制读写操作模式
- 5.3.2 控制读写内容的模式
- 5.3.3 常规使用
- 5.3.4 拓展功能
-
5.4 文件处理的其他办法
-
5.5 控制指针移动
- 5.5.1 重要概念
- 5.5.2 f.seek()
- 5.6 文件修改的两种方式
- 5.7 Type hinting
5 文件处理
5.1 字符编码
5.1.1 基本概念
-
字符编码
文字符号-----------------编码----------------->数字
文字符号<----------------编码------------------数字
-
字符编码表:一个字符对应一个数字
-
研究字符编码表是为了解决乱码问题
存取都用同一张字符编码表
-
储备知识:CPU、内存、硬盘
-
运行python程序的三个阶段
Ⅰ 先启动一个python解释器
Ⅱ python解释器会将文件内容从硬盘读入内存
Ⅲ python解释器会解释执行刚刚读入内存的代码,识别语法
x = "你好Hello"
5.1.2 发展历程
-
一家独大
ASCⅡ:只能识别英文字符,用8个bit对应一个英文字符
-
天下大乱
GBK:能识别中文和英文,用16个bit(2Bytes)对应一个字符
shift-JIS
Euc-KR
-
归于统一
unicode:能识别万国字符,常用16bit(2Bytes)对应一个字符
5.1.3 使用
? 英文字符------->内存(ASCⅡ格式的二进制数)---->硬盘(ASCⅡ格式的二进制数)
中文、英文字符------->内存(GBK格式的二进制数)----->硬盘(GBK格式的二进制数)
日文、英文字符--->内存(shift-JIS格式的二进制数)--->硬盘(shift-JIS格式的二进制数)
? 万国字符----->内存(Unicode格式的二进制数)---->硬盘(utf-8格式的二进制数)
字符-------->unicode格式的二进制(内存)---------------->utf-8格式的二进制(硬盘)
编码 编码
字符<--------unicode格式的二进制(内存)<----------------utf-8格式的二进制(硬盘)
解码 解码
x = "上"
print(x) # 打印unicode相当于打印字符
utf8_res = x.encode("utf-8")
# print(utf8_res,type(utf8_res)) # b'xe4xb8x8a' <class 'bytes'>
unicode_res = utf8_res.decode("utf-8")
print(unicode_res)
5.2 文件处理基础
5.2.1 基本概念
5.2.2 操作文件的步骤
-
rawstring原生路径
f = open(r'文件绝对路径/相对路径')
f的值,文件对象/文件句柄
-
data = f.read()
print(data)
-
f.close() # 回收系统资源
5.2.3 with上下文管理
with open(r'绝对路径或相对路径') as f1,
open(r'绝对路径或相对路径') as f2:
f1.read()
f2.read()
with open(r'第二周计划',"rt",encoding='utf-8') as f1:
data = f1.read()
print(data)
f1.close()
data = f1.read()
print(data)
5.3 文件打开模式
5.3.1 控制读写操作模式
- r : 只读(默认)
- w : 只写
- a : 只追加写
5.3.2 控制读写内容的模式
- t : 读写都是文本格式,即读写都是用字符串(默认)
- b : 读写都是bytes格式,bytes等同于二进制
强调:如果是t模式,一定要加上encoding="编码格式"
? 如果是b模式,一定不可以加上encoding="编码格式"
5.3.3 常规使用
- r:在文件存在的时候,文件指针调到文件的开头,文件不存在直接报错
r:在文件存在的时候,文件指针调到文件的开头,文件不存在直接报错
f = open("a.txt",mode="rt",encoding="utf-8")
res = f.read()
print(res)
f.close()
- w:在文件存在的时候会清空文件,指针调到文件开头,文件不存在会创建空新文件
w:在文件存在的时候会清空文件,指针调到文件开头,文件不存在会创建空新文件
f = open("a.txt",mode="wt",encoding="utf-8")
f.write("你好n666")
f.close()
- a:在文件存在的时候不会清空文件,指针跳到文件末尾,文件不存在会创建空新文件
a:在文件存在的时候不会清空文件,指针跳到文件末尾,文件不存在会创建空新文件
f = open("a.txt",mode="at",encoding="utf-8")
f.write("n777")
f.close()
rb wb ab
f = open("a.txt",mode="rb")
res = f.read()
print(res)
print(res.decode("utf-8"))
f.close()
f = open("a.txt",mode="wb")
f.write("你好".encode('utf-8'))
f.close()
with open(r'H:BaiduNetdiskDownloadLinux阶段总结imgday004主板.png',mode='rb') as f1,
open(r'C:Users曹嘉鑫Desktop1111.png',mode='wb') as f2:
# res = f1.read()
# f2.write(res)
for line in f1:
f2.write(line)
5.3.4 拓展功能
with open('a.txt',mode='r+t',encoding='utf-8') as f:
print(f.read())
print(f.writable())
print(f.readable())
f.write("你好")
with open('a.txt',mode='w+t',encoding='utf-8') as f:
print(f.writable())
print(f.readable())
f.write("你好")
res = f.read()
print("===> %s" % res)
with open('a.txt',mode='a+t',encoding='utf-8') as f:
print(f.writable())
print(f.readable())
print(f.read())
f.flush()
print(f.name)
print(f.encoding)
5.4 文件处理的其他办法
5.4.1 读操作
with open('a.txt',mode='rt',encoding='utf-8') as f:
line1 = f.readline()
print(line1)
line2 = f.readline()
print(line2)
for line in f:
print(line)
lines = f.readlines()
print(lines)
5.4.2 写操作
with open('a.txt',mode='wt',encoding='utf-8') as f:
f.write("1111n2222n3333n")
for x in "hello":
f.write(x)
f.writelines("hello") # f.write("hello")
f.writelines(["111","222","333"])
f.writelines(["111n","222n","333n"])
5.5 控制指针移动
5.5.1 重要概念
- 文件内指针移动,除了t模式下的read(n)中n代表的是字符个数
- 其他都是以bytes为单位的
with open('a.txt',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)
print(res.decode('utf-8'))
with open('a.txt',mode='r+',encoding='utf-8') as f:
f.truncate(8)
5.5.2 f.seek()
-
f.seek(移动的字节个数,模式)
-
三种模式
0 : 参照文件开头移动指针
1 : 参照当前所在的位置移动指针
2 : 参照文件末尾位置移动指针
-
只有0模式可以在t下使用
-
1和2只能在b下使用
只有0模式可以在t下使用,1和2只能在b下使用
with open('a.txt',mode='a+b') as f:
print(f.tell()) # 查看指针在文件的第几个字节
with open('a.txt',mode='r+b') as f:
f.seek(0,2)
print(f.tell())
with open('a.txt',mode='a+b') as f:
f.seek(-6,2)
# print(f.read().decode('utf-8'))
print(f.read(3).decode('utf-8'))
import time
with open('a.txt',mode='rb') as f:
f.seek(0,2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(0.1)
else:
print(line.decode('utf-8'),end="")
5.6 文件修改的两种方式
# 方式一:
# 1、以r模式打开源文件,将源文件内容全部读入内存
# 2、在内存中修改完毕
# 3、以w模式打开源文件,将修改后的内容写入源文件
# 优点:不必大量占用硬盘资源
# 缺点:耗内存,需要足够的内存空间
with open('a.txt',encoding='utf-8') as f1:
data = f1.read()
res = data.replace('hello','早上好')
with open('a.txt',encoding='utf-8') as f2:
f2.write(res)
# 方式二:
# 1、以r模式打开源文件,然后以w模式打开一个临时文件
# 2、从源文件中读一行到内存中,修改完毕后直接写入临时文件,循环往复直到操作完毕所有行
# 3、删除源文件,将临时文件名改为源文件名
# 优点:没有对内存造成过度的占用
# 缺点:需要硬盘预留出足够的空间来存放临时文件
import os
with open('a.txt',encoding='utf-8') as src_f,
open('.a.txt.swp',encoding='utf-8') as dst_f:
for line in src_f:
dst_f.write(line.replace('你好','Hello'))
os.remove('a.txt')
os.rename('.a.txt.swp','a.txt')
5.7 Type hinting
# Type hinting
def add(x: int,y: int) -> int:
res = x + y
return res
print(add.__annotations__)
# {'x': <class 'int'>,'y': <class 'int'>,'return': <class 'int'>}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|