字符编码
# 只限文本文件和字符串有关 与视频文件 图片文件等无关
# 什么是字符编码
由于计算机内部只认识二进制 但是用户在使用计算机的时候却可以看到各式各样的语言字符
字符编码:内部记录了人类字符与数字对应关系的数据
字符编码发展史
阶段一:一家独大
1.ASCII码:
# ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
![img](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fgss0.baidu.com%2F7Po3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2F42a98226cffc1e17859a54f64f90f603728de9d4.jpg&refer=http%3A%2F%2Fgss0.baidu.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639140667&t=54327ee7156b9b85672a9ca6685663f2)
阶段二:群雄割据
1. 为了能够让计算机识别中文和英文,中国人指定了GBK
一个英文字符对应1Bytes
一个中文字符对应2Bytes
补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
2. 为了能够让计算机识别日文和英文,日本人指定了shift_JIS码:记录了英文日文与数字的对应关系
3. 为了能够让计算机能够识别韩文,韩国人指定了Euc_krm码:记录了韩文英文与数字的对应关系
![img](https://img1.baidu.com/it/u=3571187381,4251953486&fm=253&fmt=auto&app=138&f=JPG?w=500&h=279)
阶段三:天下统一
为例能够时间不同国家之间的文本数据能够彼此无障碍交流需要对编码统一
unicode(万国码)
统一使用两个及以上字符记录字符与数字的对应关系
utf8(万国码的优化版本)
讲英文还是用一个字节存储
将中文使用三那个字节或更多字节存储
'''现在默认使用的编码是utf8'''
字符编码实操
1. 如何解决文件乱码的情况
文件当初以什么编码编的 打开的时候就以什么编码解
2. python解释器版本不同带来的编码差异
python2.x内部使用的编码默认是ASCII
# 文件头
coding:utf8
# 在python2中定义字符串前面要加一个小u
s = u'xxx'
python3.x内部使用utf8
自定义文件模块内容
file
settings
Editor
file and code templates
python script
![](https://img2020.cnblogs.com/blog/2608117/202111/2608117-20211111203317252-133502787.png)
3.编码与解码
编码:
将人类能够读懂的字符按照指定的编码转换成数字
解码:
将数字按照指定的编码转换成人类能够读懂的字符
# 编码
res = s.encode('utf8')
print(res, type(res)) # 为bytes类型 在python中直接将该类型看场二进制类型
# 解码
res1 = res.decode('utf8')
print(res1)
文件操作
![](https://img2020.cnblogs.com/blog/2608117/202111/2608117-20211111203751865-763496787.png)
1. 什么是文件?
文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)
2. 代码如何操作文件?
关键字open()
三步骤:
1. 利用关键字open打开文件
2. 利用其他方法操作文件
3. 关闭文件
'''
文件路径
相对路径与绝对路径
路径中出现了字母与斜杠\的组合产生了特殊含义如何取消:在路径字符串前加一个r
r'D:\py20\xxx\xxx'
'''
# open ('a.txt') 相对路径
# open(r'盘:\文件夹\文件夹\文件') 绝对路径
res = open('a.txt', 'r', encoding='utf8')
print(res.read())
res.close() # 关闭文件释放资源
'''
open(文件路径,读写模式,字符编码)
文件路径与读写模式是必须的
字符编码是可选的(有些模式需要编码)
'''
# with上下文管理(能够自动帮你close())
with open(r'a.txt, 'r', encoding='utf8') as f: # f1=open() f.close()
print(f.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.再执行写入操作
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', 'gary', 'tong']) # 可以将列表中多个字符串元素全部写入
# print(f.writable()) # True
# print(f.readable()) # Flase
f.flush() # 直接将内存内文件数据刷到硬盘 相当与ctrl+s
文件优化操作
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.read()) # 一次性读取文件内所有的内容
1. 一次性读完所有的内容,光标停留在了文件末尾 所以无法再次读取内容
2. 该方法在读取大文件的时候 可能会造成内存移除的情况
怎样解决上述情况呢:
for line in f: # 文件变量名f支持for循环 相当于一行行读取文件内容
# 遇到多行文件内容的情况 一般采用for循环读取
文件操作模式
t 文本模式
1.默认的模式
r w a >>> rt wt at
2.该模式所有操作都是以字符串基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件
b 二进制模式
1.该模式可以操作任意类型的文件
2.该模式所有操作都是以bytes类型(二进制)基本单位
3.该模式不需要指定encoding参数
rb wb ab
# 拷贝工具(支持所有类型):
res = input('请输入你要copy的文件路径及文件名:')
res2 = input('请输入需要copy到的路径及文件名:')
with open (r'%s' % res, 'rb') as f1,open (r'%s' % res2, 'wb') as f2:
for i in f1:
f2.write(i)
![](https://img2020.cnblogs.com/blog/2608117/202111/2608117-20211111203950558-1668892392.png)
文件内光标的移动
控制文件内光变的移动 .seek()
.seek(offset,wehence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式 以当前位置为参考系
2:只支持b模式 以文件末尾为参考系
文件的内容修改
方式1: 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
data = f.read()
print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
new_data = data.replace('tony','jason')
f1.write(new_data)
方式2: 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt') # 删除原文件
os.rename('c.txt.swap', 'c.txt') # 重命名文件