字符编码与文件操作

字符编码与文件操作

概要

  • 字符编码(编码/解码)

  • 文件操作(操作模式/读写模式)

详情

  • 字符编码

计算机是基于电工作的,而电信号只有高低电平两种状态。

故为了方便起见,人为的定义数字0和1用来表示计算机内的字符,这便是二进制。

字符编码是人类文字与二进制数字之间的对应关系。

字符编码的发展分为三个阶段:

1、发明者美国人的ASCII码;

2其他国家为了各自使用而发明的独有编码——GBK(中文)、Euc_kr(韩文)、Shift_JIS(日文),由于编码各自独立,各国之间的信息传递会产生错误;

3.因世界各国信息交互的需求而诞生的通用编码——unicode码(万国码),后经优化便是现在各国基本都在使用的utf-8。

编码/解码

# 编码:按照指定的编码本将人类的字符编写成计算机能够识别的二进制格式。
res1 = res.encode('GBK')
# 解码:按照指定的编码本将计算机存储的二进制数据解析成人类能够看懂的字符。
res2 = res1.encode('GBK')

编码与解码必须使用同样的字符编码,不然会报错。


  • 利用代码操作文件

打开文件的方法有两种:

1、with open(文件路径,读写模式,字符编码) as 变量名: with子代码

with open(r'aaa.txt','r',encoding='utf8') as f:
    # 一次性读取全部文件内容
    print(f.read())

2、变量名 = open(文件路径,读写模式,字符编码)

对变量的操作

变量名.close()

f = open(r'aaa.txt','r',encoding='utf8')
print(f.read())
f.close()

PS: 1.第一种方法如不需要操作该文件可使用pass补全格式;

2.文件路径前的r是源字符,用于取消路径中转义字符的含义;

3.由于第二种方法必须用.close方法关闭文件,故不推荐使用。

读写模式

r 只读模式

1.文件路径不存在则会报错;2.文件路径存在则会打开该文件并读取内容。

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

w 只写模式

1.文件路径不存在会自动创建该文件;2.文件路径存在则会先清空文件再写入内容(慎用)。

with open(r'www.txt','w',encoding='UTF-8') as f:
    f.write('比悲伤更令人悲伤的,是空欢喜。\n')

a 只追加模式

1.文件路径不存在会自动创建该文件;2.文件路径存在则会在文件末尾追加内容。

with open(r'aaa.txt','a',encoding='UTF-8') as f:
    f.write('今晚月色真美。\n')

   日常使用为了避免打开文件过大导致内存崩溃,通常会逐行读取。

with open(r'aaa.txt','r',encoding='UTF-8') as f:
    for line in f:
        print(line)

操作模式

t 文本模式(默认,上述均为)

#rt,wt,at(t可省略)
1.只能用于操作文本文件。
2.必须指定encoding即字符编码的参数。
3.以字符串为单位进行读写。

b 二进制模式

#rb,wb,ab
1.可用于操作所有文件。
2.操作文本文件用t模式更为方便,操作非文本文件只能使用此模式。
3.以二进制数为单位进行读写。
with open(r'sword.jpg','r') as fb:
    print(fb.read())
PS:该模式读文本文件需解码
with open(r'aaa.txt','rb') as ft:
    print(ft.read().decode('UTF-8'))

作业

1、利用文件操作编写一个简易的文件拷贝系统:让用户输入源文件路径和目标路径随后完成拷贝操作。

#输入源文件和目标文件的路径
source01 = input('源文件路径:')
target01 = input('目标文件路径:')
with open(source01,'rb') as copyF:
    #临时文件存放源文件数据
    data = copyF.read()
with open(target01,'wb') as copyF:
    #将目标文件数据改写为存放在临时文件中的源文件数据
    copyF.write(data)

2、利用文件操作编写一个用户注册并登录的流程,比对一次。

#注册
print('=====注册=====')
#输入新用户名
userIdNew = input('请输入新用户名:')
#输入新密码
passwdNew = input('请输入新密码:')
#将用户名和密码组成成对的字符串写入文件
uPlusP = userIdNew + '|' + passwdNew
with open(r'userInfo.txt','w',encoding = 'UTF-8') as userInfo:
    userInfo.write(uPlusP)
#登录
print('=====登录=====')
#输入用户名
userId = input('请输入用户名:')
#输入密码
passwd = input('请输入密码:')
uPlusP = userId + '|' + passwd
with open(r'userInfo.txt','r',encoding = 'UTF-8') as userInfo:
       u = userInfo.read()
       if uPlusP in u:
           print('登录成功!')
       else:
           print('登录失败!')

3、利用文件操作编写一个用户注册并登录的流程,需多次校验用户名是否重复,登录时需逐行比对。

#注册
print('=====注册=====')
#输入新用户名
userIdNew = input('请输入新用户名:')
#输入新密码
passwdNew = input('请输入新密码:')
#将用户名和密码组成成对的字符串写入文件
uPlusP = userIdNew + '|' + passwdNew + '\n'
#逐行比对,校验用户名是否已存在
with open(r'userInfoHard.txt','r',encoding = 'UTF-8') as userInfo:
    for line in userInfo:
        u = line.split('|')
        if userIdNew in u:
            print('用户名已存在!')
            break
        #用户名未重复,正常输入信息
        with open(r'userInfoHard.txt','a',encoding = 'UTF-8') as userInfo:
            userInfo.write(uPlusP)
#登录
print('=====登录=====')
#输入用户名
userId = input('请输入用户名:')
#输入密码
passwd = input('请输入密码:')
uPlusP = userId + '|' + passwd
with open(r'userInfo.txt','r',encoding = 'UTF-8') as userInfo:
       #逐行比对
       for line in userInfo:
           if uPlusP == line:
              print('登录成功!')
              break
           else:
              print('登录失败!')
posted @ 2021-08-16 22:44  Leguan001  阅读(123)  评论(0)    收藏  举报