字符编码与文件处理

作业讲解

2.字典练习题
    1.将列表中大于等于66的元素放入字典k1键对应的列表中
    	将列表中小于66的元素放入字典k2键对应的列表中
        nums=[11,22,33,44,55,66,77,88,99,90]
        dic={
            'k1':[],
            'k2':[]
        }
    2.s='hello jason jason say hello sb sb sb'
		统计字符串中每个单词出现的次数
        	{'jason':2,...}
3.集合练习题
	 一.关系运算
      有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
      pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
      linuxs={'wupeiqi','oldboy','gangdan'}
      1. 求出即报名python又报名linux课程的学员名字集合
      2. 求出所有报名的学生名字集合
      3. 求出只报名python课程的学员名字
      4. 求出没有同时这两门课程的学员名字集合
      二 去重并且保留原来的顺序
    	l = [11,22,33,22,22,33,11,22,55,66,66,77,77]
        1.去重不保留顺序
        2.去重并且保留顺序

字符编码

计算机内部存储数据都是以二进制数字的形式存储
	计算机基于电工作 而电信号只有高低电平两种状态
    也就意味着计算机的世界里只能识别两种状态
    我们人为的将高电平定义为数字1
    低电平定义为数字0
   	0	你
    1    我
    
    00	
    01
    10
    11
    
    000
    ...
    
单位换算(重要)
	比特位bit(二进制数的个数)
    8bit = 1bytes(字节)
    1024bytes = 1KB
    1024KB = 1MB
    1024MB = 1GB
    1024GB = 1TB
    1024TB = 1PB
   
字符编码的研究仅限于文本文件(******)


为什么我们人类在使用计算机输入字符的时候电脑展示是人类能够看懂的字符
而计算机内部只识别01二进制
	00001010			我
    00001101              你
    计算机二进制			设定好的对应关系		人类的字符
    
字符编码表
	规定了人类的字符与数字之间的对应关系

字符编码发展史

一家独大
	计算机是由美国人发明的 美国人需要计算机能够识别英文
    所以发明了ASCII码(字符编码表)
    	记录了英文与数字的对应关系
        	1bytes来表示所有的英文及符号
    			8bit	256
                 # 所有的英文字母及符号加起来其实也不会超过128种可能
群雄割据
	中国
    	中国人为了计算机能够识别中文发明了GBK码
        GBK码表
        	记录了中文、英文与数字的对应关系
            	2bytes来表示中文及符号
                	16bit       65535
                1bytes来表示所有的英文及符号
                    # 生僻字可能会使用更多的bytes来表示
        
    日本
    	日本人为了计算机能识别日文发明了shift_JIS码
        shift_JIS码表
        	记录了日文、英文与数字的对应关系
            1bytes来表示所有的英文及符号
            	
    韩国
		韩国人为了计算机能识别韩文发明了Euc_kr码
        Euc_kr码表
        	记录了韩文、英文与数字的对应关系
            1bytes来表示所有的英文及符号
天下一统
	群雄割据导致数据交互不通畅(乱码)
    unicode万国码
    	兼容万国字符
        所有的字符同意使用2bytes表示 不够增加更多bytes
    utf8
    	unicode transformation format
        英文还是用1bytes
        中文改用3bytes
   # 内存使用的编码表是unicode 硬盘使用的是utf8
'''已经你们只需要记住文本文件编码统一使用utf8即可'''

字符编码实操

1.解决文件乱码的核心
	文件以什么编码存的就以什么编码取
2.编码与解码(重要)
	编码
    	将人类的字符按照指定的编码转换成计算机能够识别的数据
        encode()
    解码
    	将计算机能否识别的数据按照指定的编码转换成人类能够读懂的字符
        decode()
3.python解释器默认编码
	python2默认的是ASCII码
    	在python2中定义字符串在前面加一个字母u
        文件头指定编码
        	# -*- conding:utf8 -*-
            name = u'jason'
    python3默认的是utf8码

文件操作

操作系统
	windows mac linux
双击文件
	硬盘转 磁头读取数据
保存文件
	硬盘转 磁头写入数据
 
我们在操作文件的时候其实操作的是硬盘
'''文件其实是操作系统暴露给我们可以简单快捷的操作硬盘的接口'''


绝对路径与相对路径
	绝对路径
    	非常详细的路径描述
        	无论什么人什么位置都可以找到
    相对路径
    	有一个参考
        	只有对应的人才可以找到

# res = open(r'a.txt','r',encoding='utf8')
# print(res.read())
# res.close()



# 打开a.txt 使用变量名f指代改文件
# with open(r'a.txt','r',encoding='utf8') as f:
#     print(f.read())  # 读取文件内容
    # with子代码运行结束之后会自动调用close关闭文件资源
# """
# with open(文件路径,读写模式,编码格式) as 变量名:
#     子代码块
# 文件路径是必须的
# 读写模式和编码格式是可选的
# """


# 如果不指定读写模式 那么默认使用r
# 如果不指定编码格式 那么默认使用当前计算机内部默认编码
"""在中国所有的windows电脑内部默认的编码是gbk"""
with open(r'a.txt') as f:
    print(f.read())  # 读取文件内容


# 取消转义
# res = r'D:\day08\a.txt'
# res1 = r'D:\day08\n.txt'
# res2 = r'D:\day08\t.txt'
# print(res,res1,res2)

文件处理

"""
1、什么是文件
    文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能

2、为何要用文件
    读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作

    应用程序-------------》文件对象、文件句柄
    操作系统-------------》文件
    硬件-----------------》硬盘

"""

基本格式

f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close

with open(r'a.txt',mode='rt',encoding='utf-8') as f:
    print(f.read())

文件打开模式

1.控制文件读写操作的模式
r   默认   读
w         清除之后写
a          追加,写
r 模式 :

只读模式,如果文件不存在则报错,存在则文件指针处于文件开头

f = open('a.txt',mode='rt',encoding='utf-8')
print(f.read())       读取文件
print(f.readable())   查看能否读     True
print(f.writable())  查看能否写      False

f.close()        # 以这种模式末尾不要忘记加close关闭文件
w模式:

只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头

f = open('a.txt',mode='wt',encoding='utf-8')
f.write('1111\n')     向文件写文档   \n 换行
print(readable())    
print(writable())     
f.close()
#总结:W模式,在打开文件不关的情况下,连续的write写入,新写的内容永远跟在后面
a模式:

只追加写模式,如果文件不存在则创建空文档,文件存在不会清空,文件指针处于文件末尾

f = open('a.txt',mode='at',encoding='utf-8')
f.write('222\n')
print(readable())    
print(writable())    
f.close()
# 总结:a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同
#  不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面
2.控制文件内容的模式
t   默认   读写都是以字符串为单位的,只适用于文本文件,必须指定encoding参数
b    读写都是以bytes为单位,适用于所有文件,不能指定encoding参数
b模式:

读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数

with open(r'a.txt',mode='rb') as f:
    res = f.read()
    print(res.decode('utf-8'))       decode  解码

 with open('a.txt',mode='ab') as f:
     f.write("啊手动阀手动阀".encode('utf-8'))    encode  编码
可读可写
r+t
w+t
a+t

r+b
w+b
a+b

with open('a.txt','r+t',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
文件操作其他方法
# with open('a.txt',mode='rt',encoding='utf-8') as f:
#     line = f.readline()
#     line = f.readlines()
#     print(line)          #  print(lines)
#     print(f.readline())
#     print(f.readlines())
# readline  只读一行
# readlines  每个数据以字符串形式输出,放在列表中
 with open('a.txt',mode='wt',encoding='utf-8') as f:
#     f.write("111\n222\n333\n")
#     lines = ['111\n','222\n','3333\n']
#     for line in lines:
#         f.write(line)
#     f.writelines(lines)
#     f.write('hello')
#     f.flush()                    刷新
#     f.writelines('hello')
控制文件指针移动
 with open('a.txt',mode='rt',encoding='utf-8') as f:
#     res = f.read(6)
#     print(res)

# with open('a.txt',mode='rb') as f:
#     res1 = f.read(8)
#     print(res1.decode('utf-8'))

# f.truncate()    截断
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
#     f.truncate(8)

. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
# f.seek移动的全都是字节个数
# f.seek(字节个数,0)  
# f.seek(字节个数,1)
# f.seek(字节个数,2)

posted @ 2021-06-10 20:24  wuc123  阅读(100)  评论(0)    收藏  举报