文件操作补充与函数(上)
概要
详情
一、字符编码
字符编码记录了人类的文字与二进制数的对应关系,为相互转换提供参照。
'国内的windows电脑默认使用的字符编码是GBK'
ASCII记录英文与二进制数的对应关系
        八个二进制位(8bit)对应一个字节(1bytes)
        #所以的英文符号加起来不超过127个字符(7bit)
             1.这里多保留一位以作备用
             2.在二进制下8位换算更加方便
GBK码记录英文、中文与二进制数的对应关系
        英文字符用8bit(1bytes)保存
        中文字符用16bit(2bytes)保存
        #由于汉字数量庞大,生僻字需要用更多的位数来保存
unicode码兼容多国语言
        所有的字符都是用16bit(2bytes)保存
        #使英文字符的读写效率降低
UTF-8码(unicode优化后)
        英文字符用8bit(1bytes)保存
        中文字符用24bit(3bytes)保存        
#由上可知 目前文本文件默认使用的编码是UTF-8,乱码问题主要由编码与解码使用的字符编码不一致导致。
 
二、编码与解码
#python中只有字符串类型数据可以编码
字符串.encode('字符编码')
若字符串只由英文和数字构成则可以简写
eg: b'Hello World'
#python中只有二进制类型数据可以解码
二进制数据.decode('字符编码')
#基于网络传输的数据只能为二进制类型
 
1.文件操作的方法补充
.flush()
 将内存中的数据保存至硬盘,与ctrl+s相同
.readable(),.writeable()
 判断文件是否可读、是否可写
.writelines(参数)
 按照参数将其中多个元素依次写入
with open(r'n02.txt', 'a', encoding='UTF-8') as f:
  print(f.readable())        #返回False
  print(f.writable())         #返回True
  f.writelines(['Jack', 'Ace', 'Leo']) 
  f.flush()
 
2.光标移动    .seek(offset,whence)
1.offset参数表示光标移动次数,以字节为单位
2.whence参数表示操作模式
  whence=0:文本文件或二进制文件中均可使用,光标移动至文件开头
  whence=1:只能在二进制文件中使用,光标在当前位置
  whence=2:只能在二进制文件中使用,光标移动至文件末
with open(r'csMov.txt','r',encoding = 'UTF-8') as f:
    print(f.read())
    #从开头向右移动7个字节
    f.seek(7,0)
    print(f.read())
    
with open(r'csMov.txt','rb') as f:
    print(f.read())
    #从末尾向左移动4个字节
    f.seek(-4,2)
    print(f.read())
#.read(x):参数x表示读取几个字节
 
3.文件修改
#方法一:将源文件内容抹除,写入新内容.(文件内容过大时不推荐使用)
 with open(r'aaa.txt','r',encoding = 'UTF-8') as f:
        data = f.read()
 with open(r'aaa.txt','w',encoding = 'UTF-8') as f:
        #replace():参数2代替参数1
        f.write(data.replace('a','b'))
#方法二:创建新文件,将源文件修改后的内容写入新文件,随后删除源文件,将新文件命名为旧文件.
 import os
 with open(r'aaa.txt','r',encoding = 'UTF-8') as oldF,open(r'aaa.txt.backend','w',encoding = 'UTF-8') as newF:
    for line in oldF:
        newF.write(line.replace('b','C'))
 os.remove(r'aaa.txt')
 os.rename(r'aaa.txt.backend',r'aaa.txt')
 
def 函数名(参数1,参数2)
      '''函数的注释'''
        函数体
        return 函数返回值
 
def getUserInfo ():
    '''该函数用于返回输入的用户信息'''
  newUserName = input('用户名>>>').strip()
    newPasswd = input('密码>>>').strip()
    return '%s|%s' % (newUserName,newPasswd)
 
 
作业
用户信息表(注册、登录功能结合函数优化)
![]()
def getUserInfo():
    '''返回输入的用户信息'''
    newUserName = input('用户名>>>').strip()
    newPasswd = input('密码>>>').strip()
    userInfo = [newUserName, newPasswd]
    return userInfo
def register():
    '''该函数用于注册用户'''
    #1.用户输入用户名和密码
    userInfo = getUserInfo()
    #2.校验用户名是否重复
    flag = False
    with open(r'userInfo.txt', 'r', encoding = 'UTF-8') as f:
        #循环读取每一行用户数据
        for line in f:
            userName = line.split('|')[0]
            if userInfo[0] == userName:
                print('用户名已存在!')
                break
        else:
            flag = True
    #3.如果用户名不重复,写入用户信息
    if flag == True:
        with open(r'userInfo.txt', 'a', encoding = 'UTF-8') as f:
            userStr = '%s|%s\n' % (userInfo[0], userInfo[1])
            f.write(userStr)
            print('注册成功')
    return
def logIn():
    '''该函数用于用户登录'''
    #1.用户输入用户名和密码
    userInfo = getUserInfo()
    #2.校验用户名和密码是否都正确
    with open(r'userInfo.txt', 'r', encoding = 'UTF-8') as f:
        for line in f:
            realName,realPasswd = line.split('|')
            if userInfo[0] == realName and userInfo[1] == realPasswd.strip():
                print('登录成功!')
                break
        else:
            print('用户名或密码错误')
    return
'''用户信息表注册与登录的优化版本'''
while True:
    flag = input('请选择你需要的功能:1.注册  2.登录>>>')
    if flag == '1':
        register()
    elif flag == '2':
        logIn()
    else:
        print('该功能不存在,请重新输入')
 
View Code