字符编码和文件操作
字符编码
- 定义:
只跟文本文件和字符串有关 与视频文件 图片文件等无关 - 什么是字符编码
由于计算机内部只识别二进制 但是用户在使用计算机的时候却可以看到各式各样的语言字符
字符编码:内部记录了人类字符与数字对应关系的数据 - 字符编码发展史
1、一家独大
计算机最初是由美国人发明,美国人为了能够让计算机识别英文字符
ASCII码:里面记录了英文字符与数字的对应关系,用一个字节来是对应关系
所有的英文字符和符号加起来其实不超过127
之所以使用八位是为了后续发现新的语言
A-Z:65-90
a-z:97-122
这两组数据需要记住!
2、群雄割据
GBK码:记录了英文中文与数字的对应关系
对应中文使用两个字节甚至更多字节
shift_JIS码:记录了日文英文与数字的对应关系
Euc_kr码:记录了韩文英文与数字的对应关系
3、天下一统
unicode(万国码)
统一使用两个及以上字符记录字符与数字的对应关系
utf8(万国码的优化版本)
将英文还是用一个字节存储,将中文使用三个字节或更多字节存储
现在默认使用的编码是utf8
字符编码实操
- 1.如何解决文件乱码的情况
文件当初以什么编码编的 打开的时候就以什么编码解 - 2.python解释器版本不同带来的编码差异
python2.X内部使用的编码默认是ASCII
文件头:
coding:utf8
在python2中定义字符串前面要加一个小u
s = u'你'
python3.X内部使用utf8
"""
自定义文件模板内容
file
settings
Editor
file and code templates
python script
""" - 3.编码与解码
编码:
将人类能够读懂的字符安装指定的编码转换成数字
解码:
将数字按照指定的编码转换成人类能够读懂的字符
eg:
s = '金丹强者恐怖如斯'
编码:
res = s.encode('utf8')
print(res, type(res))
解码:
res1 = res.decode('utf8')
print(res1)
文件操作
- 1.什么是文件
文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口) - 2.代码如何操作文件
关键字open()
1.利用关键字open打开文件
2.利用其它方法操作文件
3.关闭文件
路径中出现了字母与斜杠的组合产生了特殊含义如何取消,在路径字符串前面加一个r
open(r'D:\py20\day08\a.txt')
res.close() # 关闭文件释放资源
open(文件路径,读写模式,字符编码)
with上下文管理(能够自动帮你close())
with open(r'a.txt','r',encoding='utf8') as f1:
f1=open() f1.close()
print(f1.read()
以后代码操作文件 推荐使用with语法
文件读写模式
r 只读模式(只能看不能改)
路径不存在:直接报错
with open(r'b.txt', 'r', encoding='utf8') as f:
pass
路径存在
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 读取文件内所有的内容
f.write('123') # 写文件内容
w 只写模式(只能写不能看)
路径不存在:路径不存在自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
路径存在:1.会先清空文件内容 2.再执行写入操作
with open(r'a.txt', 'w', encoding='utf8') as f:
f.read()
a 只追加模式(追加内容)
路径不存在:自动创建
with open(r'a.txt','a',encoding='utf8') as f:
pass
路径存在:不会清空文件 在文件末尾添加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('\n金丹强者恐怖如斯')
我们所学习的r w a读写模式都只能操作文本文件
文件操作方法
1.读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 一次性读取文件内所有的内容
print(f.readline()) # 每次只读文件一行内容
print(f.readlines()) # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容
print(f.readable()) # 判断当前文件是否具备读的能力
2.写系列
with open(r'a.txt','w',encoding='utf8') as f:
f.write('克服一切困难 奥利给!') # 往文件内写入文本内容
f.write(123) # 写入的内容必须是字符串类型
f.writelines(['jason','kevin','tony']) # 可以将列表中多个字符串元素全部写入
print(f.writable()) # True
print(f.readable()) # False
f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
print(f.read()) # 一次性读取文件内所有的内容
for line in f: # 文件变量名f支持for循环 相当于一行行读取文件内容
以后涉及到多行文件内容的情况一般都是采用for循环读取
二进制模式读写操作
-
格式
read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示 -
eg
with open(r'a.txt','rb') as f:
print(f.read())
print(f.read(6).decode('utf8'))
文件内光标的移动
控制文件内光标的移动 f.seek()
- 格式:
f.seek(offset,whence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式 以当前位置为参考系
2:只支持b模式 以文件末尾为参考系
with open(r'b.txt', 'rb') as f:
print(f.read(4).decode('utf8'))
print(f.tell())
查看光标移动了多少个字节
文件的内容修改
- 方式1 覆盖
with open(r'a.txt','r',encoding='utf8') as f:
data = f.read()
with open(r'a.txt','w',encoding='utf8') as f1:
new_data == data.replace('tony','jason')
f1.write(new_data)
将原文件内容进行覆盖 - 方式2 新建
import os
with open('a.txt', mode='rt', encoding='utf-8') as read_f,
open('a.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('a.txt') # 删除原文件
os.rename('a.txt.swap', 'a.txt') # 重命名文件