字符编码和文件操作
字符编码
- 定义:
 只跟文本文件和字符串有关 与视频文件 图片文件等无关
- 什么是字符编码
 由于计算机内部只识别二进制 但是用户在使用计算机的时候却可以看到各式各样的语言字符
 字符编码:内部记录了人类字符与数字对应关系的数据
- 字符编码发展史
 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') # 重命名文件


 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号