昨日内容回顾和改进

1.阐述字符编码由来及发展史

字符编码是为了把人的字符编译成,计算机能识别的二进制数据,字符编码记录了字符和数字对应的关系
用于把人类字符转化成二进制数字
​
最早由美国发明ACSII编码,中记录英语对二进制一一对应的关系
每八位二进制对应一个字符,即8bit也是一字节对应一个字符
'''
所有英文符号加起来不超过127种及7字节
为什么多加一位备用
    1.多加一位可以作为备用
    2.单位换算更加简陋
'''
​
中国发明了GBK编码,中记录中文对二进制一一对应的关系,现今国内windows默认编码
    在GBK中英文字符占8位(1bit)
           中文字符占16位(2bit)
    '''
    中国纯在许多生僻字,需要多内容的bit表示:例如占用3字节或更多
    '''
​
韩国发明了Euc_kr编码,中记录韩文对二进制一一对应的关系
​
日本发明了shift_jis编码,中记录日文对二进制一一对应的关系
​
unicode编码(万国码)诞生,中记录各个国家的语言对二进制一一对应的关系
    所有字符至少要2字节表示
        缺点:英文占用过多存储空间,运行效率低
​
utf-8编码,现在默认使用的编码,是unicode的升级版本
    英文使用1字节存储
    中文采用3字节存储
    
# 结论
    目前所有的文本文件默认的编码是Utf8
    若出现乱码可能是编码和解码的字符编码不一样导致程序无法编译

2.编码与解码理论,python代码如何实现

编码:
# 只有字符串类型可以编码
语法:
字符串.encode('字符编码')
​
解码:
# 只有字节数据类型可以编码
语法:
字节型数据.decode('字符编码''''
字节型数据例如:b + '字符串'
            二进制
'''

3.文件操作语法结构及读写模型,操作模式细节

语法:
with open(r'文件相对路径或绝对路径''操作模式',字符编码) as 变量:
    命令操作
    
with open(r'文件相对路径或绝对路径''操作模式',字符编码) as 变量1,
open(r'文件相对路径或绝对路径''操作模式',字符编码) as 变量2:
    命令操作
'''   
r 为读模式
    无法读取不存在的文件
    一次读完
    开始时光标在开头,读完在结尾
    
    w 写模式
    不存在的文件直接创造
    存在,则清空文件再写内容
    
    a 追加模式
    不存在的文件直接创造
    存在,则光标在末尾
   
    文件模式 t
    rt,wt,at此为默认模式与上诉相同
    只能操作文本文件
    需要声明字符编码
    
    b 二进制模式
    rb,wb,ab
    此模式不必须申明字符编码
    只能输出和输入二进制
    可识别所有文件内容
'''    
今日内容概要
  • 作业改进
  • 文件操作补充
  • 函数(重要)

作业改进

1.

利用文件操作编写一个简易的文件拷贝系统
让用户输入需要拷贝的文件路径
然后再获取即将拷贝到哪儿的路径

way=input('请输入拷贝文件路径:')
deter_way=input('请输入目的文件路径:')
# 原来代码
# with open(way,'r',encoding='utf8') as f:
#        content = f.read()
# with open(deter_way,'w',encoding='utf8') as f:
#       f.write(content)
#读文件和打开文件声明不同变量
with open(r'%s' % way,'r',encoding='utf8') as f,open(r'%s' % deter_way,'w',encoding='utf8') as white_in:
    for content in  f:
        write_in.write(content)
'''
改进后的优点:
      逐行读取和复制,避免了文件过大导致的内存溢出  
'''

2.

利用文件操作完成用户的注册 登录
userinfo.txt
基本要求
用户注册获取用户名和密码然后写入文件 jason|123
登录获取用户名和密码之后去文件中比对
# 上述操作完成一次就算成功
拔高练习
用户注册可以多次注册并且校验用户名是否重复
登录需要逐行比对
while True:
    # 选择功能
    request = input('注册还是登录,退出请输入q:')
    # 注册界面
    if request == '注册':
        allow = True  # 用户名不重复时为True,可以执行注册输入信息
        load_allow = True  # 整个注册的循环,以保证注册成功
        while load_allow:
            # 输入注册用户、密码
            username = input('请输入注册用户名:')
            password = input('请输入注册密码:')
            with open(r'userinfo.txt','r',encoding='utf8') as f:
                # 辨认用户名是否重复
                for line in f:
                    if username == line.split("|")[0]:
                        print('用户名重复')
                        # 用户名重复则结束
                        allow = False
                        break
                    else:
                        # 允许注册内容输入
                        allow = True
            if allow:
                # 将输入内容
                with open(r'userinfo.txt', 'a', encoding='utf8') as write_in:
                    write_in.write('%s|%s\n' % (username,password))
                print('注册成功')
                load_allow = False
    # 登录界面
    elif request == '登录':
            # 输入登录信息
            username = input('请输入用户名:').strip()
            password = input('请输入密码:').strip()
            with open(r'userinfo.txt', 'r', encoding='utf8') as f:
                # 对登录的循环,登陆成功不循环,登录失败循环
                for ex_info in f:
                    real_username,real_password=ex_info.split('|')
                    # 与注册信息匹配
                    if username == real_username and password == real_password.strip('\n'):
                        print('登录成功')
                        break
                # else可以与for连用,无break可以实行功能
                else:
                    # 若无法匹配到信息,则失败
                    print('用户或密码错误')
    # 推出操作系统
    elif request =='q':
        break
    # 输入其他结果
    else:
        print('输入错误')
        continue

python的文件操作和函数_相对路径

 

 

 文件操作补充

 

for循环补充:
    for...in..:
    else:   # 没有被break打断for之后可以执行else语句

文件补充
1.flush()
    功能:
将内存中的数据立即刷到硬盘里,类似于Ctrl+s
    语法:
with open(..,..,...) as f:
    f.flush()

2.readable(),writeable()
    功能:
判断文件是否可执行某写操作,readable()判断是否可读,writeable()判断是否可写
    语法:
with open(..,..,...) as f:
    f.readable()
    f.writeable()

3.writelines()
    功能:
用于w,a模式下,逐行写入
    语法:
with open(..,..,...) as f:
    f.writelines()

4.seek()
    功能:
移动光标
seek(a,b)
    a是光标移动次数,以整数为次数
    b为操作模式,有三个操作模式
        b=0:
        可以再文本文件和二进制文件执行
        光标移动到文件开头
        b=1:
        只能在二进制文件执行
        光标处于当前位置
        b=2:
        只能在二进制文件执行
        光标移动到文档末尾

语法:
with open(..,..,...) as f:
    f.seek(a,b)

eg:
with open(r'aaa.txt','r',encoding='utf8') as f:
        print(f.read())
        f.seek(5,0)
        print(f.read())
with open(r'aaa.txt','rb') as f:
        print(f.read())
     # 二进制模式下移动的是字节 f.seek(
-3,2) print(f.read()) f.seek(-5,1) print(f.read())
python的文件操作和函数_字符编码_02

补充:
  f.read(x)
'''
在文件模式下,输出几个字符
在二进制模式下,输出几个字节
'''

补充小知识:

  硬盘中的数据被删除时,数据是被标记为可占用空间,并没有被完全删除,为了避免这种问题,可以在删除后,再下载垃圾文件覆盖

文件修复

第一种方法
with open(...,'r',encoding='utf8') as f:
    data=f.read()
with open(...,'w',encoding='utf8') as f:
    f.write(data.replace(....))
'''
缺点:当文件过大时,会导致内存溢出,降低效率
'''

第二种方法
'''
建一个新文件,将老文件内容写入新文件,过程中完成修改,之后,删除老文件,把新文件改名为老文件,词方法要用到模块
'''
import os
with open(r'old.txt','r',encoding='utf8')as old,open open(r'new.txt','w',encoding='utf8')as new:
        for line in old:
            new.write(line.replace(....))
os.remove(r'old.txt')
os.remove(r'new.txt',r'old.txt')

函数

'''
提前定义末端代码,类似于把它定义为某种工具,使用时直接使用该工具,不需要,再重新输入代码
函数使用前要先定义
'''

语法:
def 函数名(参数1,参数2):
    '函数注释'
    函数体代码
    return函数的返回值
'''
def:用于定义函数关键字的作用
函数名:性质与变量名一致,使用函数时要调用该函数即可
参数:函数与外界的联系,用于赋值,取值时可以用到
代码:就是被定义的代码,执行函数时就是在执行该代码
return:确定函数返回值,可以不存在
'''

eg:

def printMore (a,b):
  print(a+'快回家吃饭')
  print(b+'洗澡去')
printMore('小明','小红')

输出结果为:

小明快回家吃饭
小红洗澡去