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

内容回顾

  • 文件操作

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编辑  收藏  举报
  1. 1 原来你也在这儿 温余福
  2. 2 世间美好和你环环扣扣 温余福
  3. 3 随风起舞 温余福
  4. 4 罪恶都市 温余福
世间美好和你环环扣扣 - 温余福
00:00 / 03:12
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 尹初七

作曲 : 温余福

编曲 : 彭圣杰

偏偏秉烛夜游

偏偏秉烛夜游

午夜星辰 似奔走之友

爱你每个结痂伤口

酿成的陈年烈酒

入喉尚算可口

入喉尚算可口

怎么泪水 还偶尔失守

邀你细看心中缺口

裂缝中留存 温柔

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

让樱花偷偷 吻你额头

让世间美好 与你环环相扣

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

当樱花开的纷纷扬扬

当世间美好 与你环环相扣

特别鸣谢:槿葵,我们的海报制作妹妹。

原唱:柏松

吉他:柏松

和声:柏松

录音:柏松

混音:张强