一、字符编码
1.什么是字符编码?
由于计算机内部只识别二进制,但是用户在使用计算机的时候却可以看到各式各样的语言字符。
字符编码:内部记录了人类字符与数字对应关系的数据。
2.字符编码发展史
# 1.一家独大
计算机最初是由美国人发明的,美国人为了能够让计算机识别英文字符
ASCII码:里面记录了英文字符与数字的对应关系
用一个字节来是对应关系
"""
所有的英文字符和符号加起来其实不超过127
之所以使用八位是为了后续发现新的语言
"""
必须记住的对应关系有以下两组
A-Z:65-90
a-z:97-122
# 2.群雄割据
中国人
为了能够让计算机识别中文,我们需要发明另外一套编码表
GBK码:记录了英文中文与数字的对应关系
对于英文还是使用一个字节
对应中文使用两个字节甚至更多字节
"""
两个字节其实也不够表示出所有的中文
遇到生僻字可能需要更多位来表示
"""
日本人
为了能够让计算机识别日文,也需要发明一套编码表
shift_JIS码:记录了日文英文与数字的对应关系
韩国人
为了能够让计算机识别韩文,也需要发明一套编码表
Euc_kr码:记录了韩文英文与数字的对应关系
# 3.天下一统
为了能够实现不同国家之间的文本数据能够彼此无障碍交流需要对编码统一
unicode(万国码)
统一使用两个及以上字符记录字符与数字的对应关系
utf8(万国码的优化版本)
将英文还是用一个字节存储
将中文使用三个字节或更多字节存储
'''现在默认使用的编码是utf8'''
3.字符编码实操
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.编码与解码
编码:
将人类能够读懂的字符安装指定的编码转换成数字
解码:
将数字按照指定的编码转换成人类能够读懂的字符
s = '每天不要想太多 学就完事了 干就完了 奥利给!!!'
# 编码
# res = s.encode('utf8')
# print(res, type(res)) # bytes 在python中直接将该类型看成二进制数据即可
# 解码
# res1 = res.decode('utf8')
# print(res1)
二、文件操作
1.简介
1.什么是文件?
文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)
2.代码如何操作文件
关键字open()
三步走:
1.利用关键字open打开文件
2.利用其它方法操作文件
3.关闭文件
"""
文件路径
相对路径与绝对路径
路径中出现了字母与斜杠的组合产生了特殊含义如何取消
在路径字符串前面加一个r
r'D:\py20\day08\a.txt'
"""
# open('a.txt')
# open(r'D:\py20\day08\a.txt')
# res = open('a.txt', 'r', encoding='utf8')
# print(res.read())
# res.close() # 关闭文件释放资源
"""
open(文件路径,读写模式,字符编码)
文件路径与读写模式是必须的
字符编码是可选的(有些模式需要编码)
"""
# with上下文管理(能够自动帮你close())
with open(r'a.txt','r',encoding='utf8') as f1: # f1=open() f1.close()
print(f1.read())
"""以后代码操作文件 推荐使用with语法"""
2.文件读写模式
"""
补全语法结构,没有实际含义:
pass
...
"""
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()
f.write('hello world!\n')
f.write('hello world!\n')
f.write('hello world!\n')
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读写模式都只能操作文本文件
"""
3.文件操作方法
![image]()
# 文件操作方法
# 1.读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readable()) # 判断当前文件是否具备读的能力
print(f.read()) # 一次性读取文件内所有的内容
print(f.readline()) # a|1 每次只读文件一行内容
print(f.readlines())
"""
['a|1\n', '你好\n', 'jason\n', 'njnknjknkjnkj']
读取文件所有的内容,组织成列表,每个元素是文件的每行内容
"""
# 2.写系列
with open(r'a.txt', 'w', encoding='utf8') as f:
print(f.writable()) # True
print(f.readable()) # False
f.write('up') # 往文件内写入文本内容
f.write(123)
"""
write() argument must be str, not int
写入的内容必须是字符串类型
"""
f.writelines(['jason', 'kevin', 'tony'])
# 可以将列表中多个字符串元素全部写入
f.flush() # 直接将内存内文件数据刷到硬盘,相当于crl+s
4.文件优化操作
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循环 相当于一行行读取文件内容
# line
'''以后涉及到多行文件内容的情况一般都是采用for循环读取'''
5.文件操作模式
t 文本模式
1.默认的模式
r w a >>> rt wt at
2.该模式所有操作都是以字符串基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件
b 二进制模式
1.该模式可以操作任意类型的文件
2.该模式所有操作都是以bytes类型(二进制)基本单位
3.该模式不需要指定encoding参数
rb wb ab
6.二进制模式读写操作
read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
eg:简易版本的拷贝功能
1.获取待拷贝的目标文件路径
2.获取即将拷贝到哪个地方的新路径
3.利用文件操作实现数据拷贝
# 1.获取待拷贝的文件路径
wait_copy_file = input('file path>>>:').strip()
# 2.获取新的文件路径
new_file_path = input('new path>>>:').strip()
# 3.以r模式打开步骤1的路径,以w模式打开步骤2的路径
with open(r'%s' % wait_copy_file, 'rb') as f1, \
open(r'%s' % new_file_path, 'wb') as f2:
for line in f1:
f2.write(line)
7.文件内光标的移动
f.seek() 控制文件内光标的移动
f.seek(offset, whence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式,以当前位置为参考系
2:只支持b模式,以文件末尾为参考系
# 小练习:实现动态查看最新一条日志的效果
import time
with open('a.txt', 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(0.01)
else:
print(line.decode('utf-8'), end='')
8.文件的内容修改
# 方式1 覆盖
# with open(r'a.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='utf8') as read_f,\
# open('c.txt.swap', mode='wt', encoding='utf8') as write_f:
# for line in read_f:
# write_f.write(line.replace('tony', 'jason'))
# os.remove('c.txt') # 删除原文件
# os.rename('c.txt.swap', 'c.txt') # 重命名文件