文件操作、读写模式、操作模式、光标的移动

内容回顾

  • 文件操作

1.什么是文件?
	文件就是操作系统暴露给用户可以操作硬盘的快捷方式
2.代码如何操作文件
	关键字open()
    分三步:1、利用关键字open打开文件 2、利用其他方法打开 3、关闭文件
# 文件路径:相对路径与绝对路径 当路径中出现了字母与反斜杠的组合产生了特殊含义——>在路径字符串前面加一个r
	r'D:\py38\day09\a.txt'
3.代码打开文件的两种方式
open(文件路径,读写模式,字符编码) 文件路径与读写模式是必须的 字符编码是可选的(有些模式需要编码)
方式一:
    f = open(文件路径,读写模式,encoding='utf8')
    f.close()  # 关闭文件释放资源
方式二:
    with open('a.txt', 'r', encoding='utf8') as f:
        with子代码
with上下文管理好处在于子代码运行结束自动调用close方法关闭资源 在今后代码操作文件推荐使用with语法
with支持一次性打开多个文件
	with open() as f1,open() as f2,open() as f3:
        with子代码
'''
当我们在编写代码对的时候 有些部分不知道写什么具体代码
补全语法结构 没有实际含义
	pass
	...
'''
  • 文件读写模式

r 模式

'r'  只读模式:只能读不能写
1.文件路径不存在:会直接报错
with open(r't.txt', 'r', encoding='utf8') as f:
    print(f.read())
2.文件路径存在:正常读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f..read())

w 模式

'w'  只写模式:只能写不能读
1.文件路径不存在:自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
    pass
2.文件路径存在:先清空文件内容 之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
    # f.read()报错
    f.write('hello world\n')
    f.write('hello world\n')
 '换行符要自己添加 并且在后续数据读取比对的时候也需注意它的存在'

a 模式

'a'  只追加模式:文件末尾添加数据
1.文件路不径存在:自动创建
with open(r'g.txt', 'a', encoding='utf8') as f:
    f.write('我是多么的爱学习啊')
  • 文件操作模式

t 文本模式

默认的模式
r	w	a 实际全称是 rt	wt	at
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码

b 二进制模式(bytes模式)

不是默认的模式	需要自己指定:rb	wb	ab
1.可以操作任意类型的文件
2.读写都是以bytes为单位
3.不需要指定的encodinng参数 因为已经是二进制模式了 不需要编码
  • 文件的诸多方法

1.读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 一次性读取文件内所有的内容
    print(f.readline())  # 每次只读文件一行内容
    print(f.readlines())  # 读取文件所有内容 组织成列表 每个元素是文件的每行内容
    print(f.readable())  # 判断文件是否具备读的能力
    #   read()   括号内可以放数字
    在t模式下表示字符个数
    在b模式下表示字节个数
 英文字符统一使用一个bytes来表示
 中文字符统一使用三个bytes来表示
    
for循环    
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 一次性读取文件内所有内容
    print(f.read())  # 一次性读取文件内所有内容
    print(f.read())  # 一次性读取文件内所有内容
'''
一次性读完之后 光标停留在了文件末尾就无法再次读取内容
该方法在读取大文件的时候 可能会造成内存溢出的情况
解决上述问题的策略是逐行读取文件内容——>文件变量名f支持for循环 相当于一行行读取文件内容
 '''
with open(r'a.txt', 'r', encoding='utf8') as f1:
    for line in f1:
        line	# 涉及到多行内容的情况一般采取for循环读取
        
2.写系列
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('我爱学习')  # 往文件内写入文本内容
    f.write(123)  # 报错 写的内容必须写字符串类型
    f.writelines(['jaosn', 'kevin', 'tony'])  # 可以将列表中多个字符串类型的数据值全部写入
    print(f.writeable())  # 判断文件是否具有写的能力
    f.flush()  # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
  • 文件内光标的移动

with open(r'b', '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(offseet, whence)
	offset表示位移量
		始终以字节为最小单位
			正数从左往右移动
			负数从右往左移动
	whence表示模式
		0:基于文件开头 文本和二进制模式都可以使用
		1:只支持二进制模式 基于当前位置
		2:只支持二进制模式 基于文件末尾
'''
  • 练习

# 1.编写简易版本的拷贝工具
#      自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
#      任何类型数据皆可拷贝
#      ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
old_file = input('old_path>>>:')
new_file = input('new_path>>>:')
with open(rf'{old_file}', 'rb') as f, open(r'%s' % new_file, 'wb') as f1:
    for line in f:
        f1.write(line)
 2.利用文件充当数据库编写用户登录、注册功能
#   文件名称:userinfo.txt
#   基础要求:
#   		 用户注册功能>>>:文件内添加用户数据(用户名、密码等)
#        用户登录功能>>>:读取文件内用户数据做校验
#       ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
#   拔高要求:
#        用户可以连续注册
#       用户可以多账号切换登录(多用户)  文件内有多个用户信息
#       ps:思考多用户数据情况下如何组织文件内数据结构较为简单
#     提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
while True:
    print('''
    1.注册功能
    2.登入功能
    ''')
    choice = input('请输入功能项>>>:').strip()
    if choice == '1':
        register_name = input('请注册您的用户名>>>:').strip()
        register_password = input('请注册您的密码>>>:').strip()
        user_info = f'{register_name} {register_password}\n'
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for i in f:
                name, pwd = i.split(' ')
                if register_name == name:
                    print('用户已存在')
                    break
            else:
                with open(r'userinfo.txt', 'a', encoding='utf8') as info:
                    info.write(user_info)
                    print(f'{register_name}用户创建成功')
    elif choice == '2':
        login_user = input('请登入您的账号>>>:').strip()
        login_pwd = input('请输入密码>>>:').strip()
        with open(r'userinfo.txt', 'r', encoding='utf8') as info1:
            for line in info1:
                real_user, real_pwd = line.split(' ')
                if login_user == real_user and login_pwd == real_pwd.strip('\n'):
                    print('登入成功')
                    break
            else:
                print('用户名或密码错误')
    else:
        print('暂无该功能项')
posted @ 2022-10-08 23:48  小福福  阅读(67)  评论(0编辑  收藏  举报