Welcome!!!

F

伞兵一号,申请出战

字符编码和文操作

字符编码和文操作

字符编码简介

#什么是字符编码?
	字符编码主要的研究对象是文本文件,即字符串文本(图片,音频,视频除外)
    
文本编辑器读取文件内容的流程
	#阶段1、启动python解释器,此时就相当于启动了一个文本编辑器
	#阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
	#阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法 
python解释器执行文件的流程
	#阶段1、启动python解释器,此时就相当于启动了一个文本编辑器
	#阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
	#阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法
    
计算机底层存储数据的原理
	'''储存的是0101010101这种的二进制代码'''

字符编码的发展史

人类为了让计算机读懂人类语言,发明了字符编码表,即用特定的01010101来指代我们的语言和符号
1. 一家独大
	因为计算机是由美国人发明的,所以世界上第一款字符编码也是美国人发明的,即ASCII码。
    ASCII码:只记录了英文字符与数字的对应关系
    	1bytes(八位二进制)储存英文字符
        	"""
        	A-Z:65-90
        	a-z:97-122
        	0-9:48-57
        	"""
            
2. 群雄割据
	后来,由于计算机在世界各国得到普及,这些国家也需要计算机认识他们的语言,所以各国也发明了自己的字符编码。
    中国:
    	GBK码:记录了英文、中文与数字的对应关系
            1bytes存储英文字符
            2bytes存储中文字符,不够则向上加字节
    韩国:
        Euc_kr:记录了英文、韩文和数字的对应关系
    日本:
        shift_JIS:记录了英文、日文和数字的对应关系
    """
    	这一阶段产生了一个非常奇怪的现象>>>乱码
    	其实就是写文本的编码和读文本的编码不一致导致的
    	解决方法:逐个编码试,找出正确的那个编码
    """
    
3. 天下一统
	再后来,各个国家为了互联网交流的方便,不出现乱码,发明了一种所有国家的文字都兼容的字符编码——万国码(unicode)
    unicode所有字符统一采用至少2bytes存储
    
   	现在的计算机可以输出所有国家的字符,就是因为其内存使用的是unicode编码
    但是,因为Unicode所有字符至少使用两个字节存储,会存在浪费存储空间和IO时间的问题,所以,人们又开发出了他的优化版——utf编码
    utf码有很多版本,现在使用比较多的是utf8
    	优化了unicode存储数据的容量
        	1bytes存储英文字符
            3bytes存储中文字符
# 结论:内存中的编码不需要考虑 值考虑硬盘上的即可  utf8

字符编码的实际应用

# 1. 编码与解码
	编码(encode)
    	将人类的语言转换成计算机能识别的语言
    解码(decode)
    	将计算机能识别的语言转换成人类的语言
    eg:
        # 编码    encode
        s1 = '你好'
        print(s1.encode('gbk'))
        # >>>b'\xc4\xe3\xba\xc3'
        
        # 解码 decode
        s1 = b'\xc4\xe3\xba\xc3'
		print(s1.decode('gbk'))
        # >>>你好
        """
        字符串前面如果加了字母b 表示该数据类型为 bytes类型
            bytes类型可以看成是二进制
        """
        """
        基于网络传输数据 数据都必须是二进制格式
            所以肯定涉及到编码与解码
        """
# 2. 解决乱码问题
	数据写的时候用的什么编码就用什么编码解
    不行多试几个
# 3. python解释器层面
	python2.X解释器默认使用的编码是ASCII码
    	1. 文件头指定编码:写在文件最上面一行,指定下文使用编码
        	# coding:utf8
            # -*-coding:utf8-*-
        2. 字符前缀:在使用python2.X解释器时,在字符串前面加u
            name = u'程序猿伞兵一号'
    python3.X解释器默认使用utf8

文件操作简介

# 文件的概念
	文件是操作系统暴露给用户可以直接操作硬盘的接口
# 代码操作文件的流程
	1. 打开文件
    2. 编辑文件内容
    3. 保存文件内容
    4. 关闭文件
# 基本语法结构
	结构一(了解即可):
        f = open()
        ...对文件的操作代码...
        f.close()
    结构二(推荐使用,更简洁方便,省去关闭文件的步骤):
        with open() as f:
            pass
    # open方法
    使用open()方法
    '''以后写路径为了防止特殊符号 直接加r'''
    # open(r'a.txt')  # 相对路径
    # open(r'D:\py1\day09\a.txt')  # 绝对路径
    # res = open(r'a.txt', 'r', encoding='utf8')
    """
    open(文件的路径,文件的操作模式,文件的编码)
        1.文件的路径是必须要写的
        2.文件的操作模式、文件的编码有时候不用写(一会儿讲)
    """
    # print(res.read())  # 读取文件内容
    # res.close()  # 关闭文件
    
    """上述操作open完最后都需要执行close 而close这一行很任意被遗忘"""
    # with上下文管理
    with open(r'a.txt', 'r', encoding='utf8') as f:  # f = open()
        data = f.read()
    print(data)
    

文件的读写模式

r	read	只读模式:只能读不能写
w	write	只写模式:只能写不能读
a	append 只追加模式:在文件末尾添加内容

# r模式
# 路径不存在:直接报错
# with open(r'b.txt', 'r', encoding='utf8') as f:
#     # pass  (推荐)补全语法结构 本身没有任何功能
#     # ...  (不推荐)补全语法结构 本身没有任何功能
#     pass
# 路径存在:正常打开文件并等待内容读取
with open(r'a.txt', 'r', encoding='utf8') as f:
    # print(f1.read())  # 一次性读取文件内所有的内容
    f.write('程序猿伞兵一号')  # 报错
"""
able在英语中大部分情况下表示的是 具备...的能力
    readable    具备读的能力
    writable    具备写的能力
    ...
"""

# w模式
# 路径不存在:自动创建文件
# with open(r'b.txt', 'w', encoding='utf8') as f:
    # pass  (推荐)补全语法结构 本身没有任何功能
    # ...  (不推荐)补全语法结构 本身没有任何功能
    # pass
# 路径存在:先清空文件内容 之后再写入数据
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('程序猿伞兵一号\n')  # 写入文件内容
    f.write('程序猿伞兵二号\r')  # 写入文件内容
    f.write('程序猿伞兵三号\n')  # 写入文件内容
    print(f.read())
"""
换行  最早的时候:\r\n
为了节省空间支持一个字符 根据操作系统的不同可能有所区别
    \n 、 \r
"""

# a模式
# 路径不存在:自动创建文件
# with open(r'c.txt', 'a', encoding='utf8') as f:
#     pass
# 路径存在:不会清空文件内容 而是在文件末尾等待新内容的添加
# with open(r'a.txt', 'a', encoding='utf8') as f:
    # f.write('程序猿伞兵一号')
    # print(f.read())

文件内置方法

read()  # 一次性读取文件内容
	1.执行完之后光标在文件末尾 继续读取没有内容
    2.当文件内容特别大的时候 容易造成内存溢出(满了)
readline()  # 一次只读一行内容
readlines()  # 结果是一个列表 里面的各个元素是文件的一行行内容
readable()  # 判断当前文件是否可读
支持for循环  # 一行行读取文件内容(推荐使用)  内存中同一时刻只会有一行内容
write()  # 写入文件内容(字符串或者bytes类型)
writelines()  # 可以将列表中多个元素写入文件
writable()  # 判断文件是否可写
flush()  # 相当于主动按了ctrl+s(保存)  
posted @ 2022-03-14 21:06  程序猿伞兵一号  阅读(121)  评论(0编辑  收藏  举报