Python学习路程——Day09

Python学习路程——Day09

文件操作

1、文件的概念

'''
	操作系统为了使用户更好的使用计算机,而创建的一个快捷方式。
	双击一个文件,相当于把硬盘的数据资源加载到内存中。
'''

2、打开文件的方法

'''
变量名 = open('文件路径', ’读写模式', encoding = 'utf8')
变量名.close
'''
f = open(' ', ' ', encoding = 'utf8')
print(f.read())
f.close()
'''
with 上下文管理
with open('文件路径', ’读写模式', encoding = 'utf8') as f:
	print(f.read())
	with上下文管理的好处在于:
	当with的子代码结束后,自动调用close()方法,结束文件的调用。
	也支持同时打开多个文件

文件路径:在程序处于同一个文件夹下,可以之间文件名+文件后缀打开,如果不在同一个文件夹下,需要写绝对路径打开。
注意:
由于\在代码中有特殊含义,故在写绝对路径前使用 r
'''
with open(r'D:\示例.txt', 'r', encoding = 'utf8') as f:
    print(f.read())

3、文件读写模式

'''
'r': 只读:只能读不能写
'w':只写:只能写不能读
'a':只追加:文件末尾添加数据
'''

4、pass 和 ...

'''
只补全语法结构,没有实际含义
'''

5、文件操作模式

'''
t	文本模式(rt、wt、at)
特点:
	1、只能操作文本文件
	2、读写都是以字符为单位
	3、需要指定encoding参数,如果不采用使用计算机默认的编码
b	二进制模式(bytes模式)(rb、wb、ab)
不是默认的模式,需要指定
特点:
	1、可以操作任何类型的文件
	2、读写都是以字节(bytes)为单位
	3、二进制模式、不需要指定编码参数
前面加b直接转为二进制,只有字母和数字
'''

6、编码、解码

'''
编码:
	res = '字符串'
	data  = bytes(res, 'utf8') # encode()
解码:
	ret = str(data, '')
'''

7、.read()方法

'''
.rede()方法:
	一次性读取文件内容,光标从头读到尾
	在同一次的操作中,多次读取,
	文件内容过大时,可能会造成内存溢出
read()括号内,可以填写数字,在文本模式下表示读取多少个字符。
'''

8、for循环读文件

'''
一行行读取文件内容 避免内存溢出现象的产生
'''

9、.readline()方法

'''
一次性读取所有文件内容,会根据行数组成列表
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
'''
['study hard and make progress every day\n', 'study hard and make progress every day\n', 'study hard and make progress every day\n', '很开心见到了你']

10、.readable()方法

'''
判断文件是否具备读数据的能力会返回true和false
'''

11、write()方法

'''
将字符串写入文件,返回的是写入的字符长度。
'''

12、writeable()方法

'''
判断文件是否具备写数据的能力true和false
'''

13、writlines()方法

'''
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
'''

14、flush()方法

'''
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
'''

光标移动

with open(r'a.txt','rb')as f:
    print(f.read())
    f.seek(0,0)
    print(f.read())
    f.seek(0,0)
    print(f.read())
    print(f.tell())#返回光标距离文件开头产生的字节数
    seek(offset,whence)
    offset 是位移量  以字节为单位
    whence 是模式  0  1  2
    0是基于文件开头:文本和二进制模式都可以用
    1是基于当前位置:二进制模式可以用
    2是基于文件末尾:二进制模式可以用
    使用encode 编码
       decode 解码

练习:

1.编写简易版本的拷贝工具
     自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
     任何类型数据皆可拷贝
     ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
soure_file_path = input('拷贝文件路径').strip()
target_file_path =input('目标路径').strip()
with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f:
    for line in read_f:
        writr_f.write(lin)
2.利用文件充当数据库编写用户登录、注册功能
  文件名称:userinfo.txt
  基础要求:
  		 用户注册功能>>>:文件内添加用户数据(用户名、密码等)
       用户登录功能>>>:读取文件内用户数据做校验
      ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
  拔高要求:
       用户可以连续注册
      用户可以多账号切换登录(多用户)  文件内有多个用户信息
      ps:思考多用户数据情况下如何组织文件内数据结构较为简单
    提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
while True:
    print("""
    1.注册功能
    2.登录功能
    """)
    choice = input('请选择您想要执行的功能编号>>>:').strip()
    if choice == '1':
        username = input('please input your username>>>:').strip()
        password = input('please input your password>>>:').strip()
        # 2.校验用户名是否已存在
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:  # 'jason|123'
                real_name, real_pwd = line.split('|')
                if username == real_name:
                    print('用户名已存在 无法完成注册')
                    break  # 一旦重复 没有必要继续往下校验是否重复了 直接结束循环
            else:
                with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
                    f1.write(f'{username}|{password}\n')
                print(f'用户{username}注册成功')
    elif choice == '2':
        # 1.获取用户名和密码
        username = input('please input your username>>>:').strip()  # 'jason'
        password = input('please input your password>>>:').strip()  # '123'
        # 2.打开文件读取内容并校验
        with open(r'userinfo.txt', 'r', encoding='utf8') as f:
            for line in f:  # 'jason|123\n'
                real_name, real_pwd = line.split('|')  # 'jason' '123\n'
                if real_name == username and real_pwd.strip('\n') == password:
                    print('登录成功')
                    break
            else:
                print('用户名或密码错误')
    else:
        print('没有该功能编号')     
posted @ 2022-10-09 19:14  负剑远游行归来仍少年  阅读(48)  评论(0)    收藏  举报