字符编码和Python代码操作文件

字符编码和Python代码操作文件

读写模式之a模式

# a模式  只追加模式
# 路径不存在:自动创建
with open(r'a.txt','a',encoding='utf8') as f:
    pass
# 路径存在:不会清空文件 在文件末尾添加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
    f.write('\n今天周四了 马上又要放假了 好开心!')
    
 
"""
	我们所学习的r w a读写模式都只能操作文本文件,其他模式需要用d模式
"""

文件操作方法

# 文件操作方法
# 1.读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
    # print(f.read())  # 一次性读取文件内所有的内容
    # print(f.readline())  # 每次只读文件一行内容
    # print(f.readlines())  # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容
    # print(f.readable())  # 判断当前文件是否具备读的能力


# 2.写系列
with open(r'a.txt','w',encoding='utf8') as f:
    # f.write('克服一切困难 奥利给!')  # 往文件内写入文本内容
    # f.write(123)  # 写入的内容必须是字符串类型
    # f.writelines(['jason','kevin','tony'])  # 可以将列表中多个字符串元素全部写入
    # print(f.writable())  # True
    # print(f.readable())  # False
    f.flush()  # 直接将内存内文件数据刷到硬盘 相当于ctrl+s

文件优化操作

with open(r'a.txt', 'r', encoding='utf8') as f:
    # print(f.read())  # 一次性读取文件内所有的内容
    # print(f.read())  # 一次性读取文件内所有的内容
    # print(f.read())  # 一次性读取文件内所有的内容
    """
    1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容
    2.该方法在读取大文件的时候 可能会造成内存溢出的情况
        解决上述问题的策略就是逐行读取文件内容
    """
    # for line in f:  # 文件变量名f支持for循环  相当于一行行读取文件内容
    #     line
    '''以后涉及到多行文件内容的情况一般都是采用for循环读取'''

课堂练习

1.简易版本的注册、登陆功能
	普通要求(实现一次即可)
    	注册功能
        	获取用户名和密码组织成你喜欢的样子写入文件即可
        登陆功能
        	获取用户名和密码然后比对是否与文件内用户数据一致
 
# 注册功能
    # 1.获取用户用户名和密码
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 2.将用户名和密码组织成一个字符串
    data = '%s|%s' % (username, password)
    # 3.文件操作 写入数据
    with open(r'userinfo.txt', 'w', encoding='utf8') as f:
        f.write(data)
    print('用户:%s 注册成功' % username)
 
# 登录功能
    # 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 2.获取文件内真实的用户数据
    with open(r'userinfo.txt','r',encoding='utf8') as f:
        # 由于现在文件中只有一行内容 我们干脆直接读取完
        data = f.read()  # 'jason|jason123'
        '''with子代码执行完之后的结果是可以在外面使用的'''
    # 3.切割字符串获取真实的用户名和密码
    res = data.split('|')  # ['jason', 'jason123']
    '''这里也可以直接使用解压赋值的操作  real_name,real_pwd = data.split('|')'''
    # 4.比对数据
    if username == res[0] and password == res[1]:
        print('登录成功')
    else:
        print('用户名或密码错误')

进阶练习

# 多用户注册
# while True:
#     # 1.获取用户用户名和密码
#     username = input('username>>>:').strip()
#     password = input('password>>>:').strip()
#     # 2.将用户名和密码组织成一个字符串
#     data = '%s|%s\n' % (username, password)
#     # 2.1.判断用户名是否已存在
#     with open(r'userinfo.txt', 'r', encoding='utf8') as f1:	
#         # 2.2.循环读取每一行用户数据
#         for line in f1:
#             # 2.3.获取每一行数据中的用户名
#             real_name, real_pwd = line.split('|')
#             # 2.4.判断用户名是否一致
#             if username == real_name:
#                 print('用户名已存在')
#                 break
#         else:
#             # 3.文件操作 写入数据
#             with open(r'userinfo.txt', 'a', encoding='utf8') as f:
#                 f.write(data)
#             print('用户:%s 注册成功' % username)


# 多用户登录
# 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
    for line in f:
        # 3.切割字符串获取真实的用户名和密码
        '''注意密码末尾有\n'''
        real_name, real_pwd = line.split('|')  # ['jason', 'jason123\n']
        # 4.比对用户名和密码是否正确
        if username == real_name and password == real_pwd.strip('\n'):
            print('登录成功')
            break
    else:
        print('用户名或密码错误')

代码整合

while True:
    print("""
    1.用户注册
    2.用户登录
    """)
    choice = input('请输入您想要执行的功能编号>>>:').strip()
    if choice == '1':
        # 1.获取用户用户名和密码
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.将用户名和密码组织成一个字符串
        data = '%s|%s\n' % (username, password)
        # 2.1.判断用户名是否已存在
        with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
            # 2.2.循环读取每一行用户数据
            for line in f1:
                # 2.3.获取每一行数据中的用户名
                real_name, real_pwd = line.split('|')
                # 2.4.判断用户名是否一致
                if username == real_name:
                    print('用户名已存在')
                    break
            else:
                # 3.文件操作 写入数据
                with open(r'userinfo.txt', 'a', encoding='utf8') as f:
                    f.write(data)
                print('用户:%s 注册成功' % username)
    elif choice == '2':
        # 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.获取文件内真实的用户数据
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:
                # 3.切割字符串获取真实的用户名和密码
                '''注意密码末尾有\n'''
                real_name, real_pwd = line.split('|')  # ['jason', 'jason123\n']
                # 4.比对用户名和密码是否正确
                if username == real_name and password == real_pwd.strip('\n'):
                    print('登录成功')
                    break
            else:
                print('用户名或密码错误')
    else:
        print('没有改功能 爱咋滴咋滴!')

文件操作模式

t	文本模式
	1.默认的模式
    	r w a  >>> rt wt at
    2.该模式所有操作都是以字符串基本单位(文本)
    3.该模式必须要指定encoding参数
    4.该模式只能操作文本文件
    
b   二进制模式
	1.该模式可以操作任意类型的文件
    2.该模式所有操作都是以bytes类型(二进制)基本单位
    3.该模式不需要指定encoding参数
    	rb wb ab

二进制模式读写操作

# with open(r'a.txt','rb') as f:
#     # print(f.read())
#     print(f.read(6).decode('utf8'))


# with open(r'a.txt','r',encoding='utf8') as f:
    # print(f.read())
    # print(f.read(4))

"""
read()  括号内可以放数字
    在t模式下表示字符个数
    在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""

文件内光标的移动

with open(r'b.txt', 'rb') as f:
    print(f.read(4).decode('utf8'))
    print(f.tell())  # 查看光标移动了多少个字节
    f.seek(3, 1)
    print(f.read().decode('utf8'))
"""
控制文件内光标的移动  f.seek()
f.seek(offset,whence)
    offset表示位移量
        始终是以字节为最小单位
            正数从左往右移动
            负数从右往左移动
    whence表示模式
        0:以文件开头为参考系(支持tb两种模式)
        1:只支持b模式 以当前位置为参考系
        2:只支持b模式 以文件末尾为参考系
"""

# 小练习:实现动态查看最新一条日志的效果
import time
with open('a.txt', 'rb') as f:
    f.seek(0, 2)
    while True:
        line = f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5)
        else:
            print(line.decode('utf-8'), end='')

文件的内容修改

# 方式1 覆盖
 with open(r'c.txt','r',encoding='utf8') as f:
     data = f.read()
     # print(type(data))  >>> str
 with open(r'c.txt','w',encoding='utf8') as f1:
     new_data = data.replace('tony','jason')
     f1.write(new_data)
1.不适合修改量大的文件
	
# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原文件
os.rename('c.txt.swap', 'c.txt')  # 重命名文件
1.需要插入模块才能实现删除功能
2.多创建一个文件

小练习

员工管理系统思路

1.整理今日内容并完成博客编写
2.熟练掌握课堂练习
	普通版本  必会
    进阶版本与封装版本掌握越快越好
3.写一个简易的拷贝工具
	支持所有的文件类型

答案(2)

1.循环打印系统中拥有的功能
2.获取用户输入的功能编号并判断是否在已有功能中
3.先在循环外定义存储用户数据的列表(用户数据放在列表元素用字典形式)
4.先获取用户的编号
5.循环获取列表中每个用户字典 判断用户编号是否存在
6.存在则提示用户并重新打印全部功能
7.如果不存在则获取用户其他数据并组织成一个字典
8.最后添加到用户列表
# 1.简易版本的注册、登陆功能
# 	普通要求(实现一次即可)
#     	注册功能
#         	获取用户名和密码组织成你喜欢的样子写入文件即可
#         登陆功能
#         	获取用户名和密码然后比对是否与文件内用户数据一致

print('''
    \33[31m1.用户注册
    \33[32m2.用户登录
    \33[33m3.删除用户
    \33[34m4.退出用户''')  # 定义系统的几个功能
while True:
    # 1. 注册功能,添加用户,首先获取用户创建的信息,然后存入数据库
    # 1.1 获取用户创建的信息
    choice = input('\033[35m选择功能编号:').strip()
    if choice == '1':
        print('\33[31m——————进入用户注册功能!——————')
        login_username = input('\33[31m请输入注册用户名:').strip()
        login_password = input('\33[31m请输入注册密码:').strip()
        # 1.2 将数据整合到一起
        login_msg = f'{login_username}|{login_password}\n'
        # 1.3 判断输入的注册信息是否在数据库中,需要读取数据库中的 用户名
        with open(r'login_date.txt', 'r', encoding='utf8') as f1:
            for line in f1:
                read_date_username, read_date_password = line.split('|')
                if login_username == read_date_username:  # 1.4 如果在数据库,那就不行
                    print('\33[36m该用户已存在,请更换用户名以继续!')
                    break
            else:
                # 1.5 不在数据库,就需要将数据写入数据库中
                with open(r'login_date.txt', 'a', encoding='utf8') as f2:
                    f2.write(login_msg)
                print(f'\33[36m用户{login_username}注册成功')

    elif choice == '2':
        print('\33[32m——————进入用户登录功能!——————')
        # 1. 获取用户输入的信息
        inp_username = input('输入用户名:').strip()
        inp_password = input('请输入密码:').strip()
        login_msg1 = f'{inp_username}|{inp_password}'
        # 2. 将数据库的信息读出来  跟用户输入的进行比对
        with open(r'login_date.txt', 'r', encoding='utf8') as f3:   # 读信息
            for line in f3:   # 把数据库内的数据一行一行的循环比对
                read_date_username1, read_date_password1 = line.split('|')
                if inp_username == read_date_username1:
                    print(f'\33[32m用户{read_date_username1}登录成功!')
                    break
            else:
                print('\33[31m未查询到此用户,请进行注册!')
    elif choice == '3':
        print('\33[33m用户删除')
    elif choice == '4':
        print('\33[34m退出程序')
    else:
        print('你个憨皮,未开通此功能!')

答案(3)

3.写一个简易的拷贝工具   ( 支持所有的文件类型 )

source_file = input('输入源文件路径:').strip()
destination_file = input('输入目标文件路径:').strip()
with open(rf'{source_file}','rb') as f1,open(rf'{destination_file}','wb') as f2:
    for line in f1:
        res = f2.write(line)
        print(res)

posted @ 2021-11-11 22:09  Panda_Xin  阅读(41)  评论(0编辑  收藏  举报