文件操作

文件操作

1.文件的概念
	就是操作系统展示给用户操作硬盘的快捷方式
    eg:双击一个文件 就是从硬盘将数据加载到内存
    	ctrl+s保存文件 就是将内存数据刷到硬盘保存
        
2.代码打开的方式
	方式1:
        f = open(文件路径,读写模式,encoding='utf8')
        f.close
        
	方式2:with open('a.txt','r',encoding='utf8')as f1:
            with子代码块
   ps:with上下文管理好处在于子代码运行结束自动调用close方法关闭资源
    
    """
    open方法第一个参数是文件路径 并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前加字母r
    D\a\n\t
    r'D\a\n\t'
 以后涉及到路径编写 推荐加上r
 
 with支持一次性打开多个文件
 	with open() as f1,open() as f2,open() as f3:
 		子代码
    """

文件读写模式

'r'		只读模式:只能读不能写
    # 1.文件路径不存在:会直接报错
    # with open(r'b.txt','r',encoding='utf8')as f:
    #		print(f.read())
     2.文件路径存在:正常读取文件内容
     with open(r'a.txt','r',encoding='utf8')as f:
        print(f.read())
'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.write('明天上课了真开心\n')
        f.write('明天上课了真开心\n')
        f.write('明天上课了真开心\n')
    """
    强调:换行符需要自己添加 并且在后续数据读取比对的时候也一定要注意它的存在
    """
'a'		只追加模式:文件末尾添加数据
    # 1.文件路径不存在:自动创建
    # with open(r'c.txt','a',encoding='utf8')as f:
    #		pass
     2.文件路径存在:自动在末尾等待追加内容
     with open(r'a.txt','a',encoding='utf8')as f:
        f.write('好好学习天天向上')
        
 """
 当我们在编写代码的时候 有些部分不知道写什么具体的代码 但是也不能空着不写 
 这个时候可以使用关键字
 		pass
 		...
 只补全语法不执行功能	本身没有任何意义
 """

文件操作模式

t	文本模式
	默认的模式 我们上面所写的 r w a 其实全称是 rt wt at
    1.只能操作文本模式
    2.读写都是以字符为单位
    3.需要制定encoding参数 如果不知道则会采用计算机默认的编码
    
b	二进制模式(bytes模式)
	不是默认模式 需要自己指定 rb wb ab
    1.可以操作任意类型的文件
    2.读写的都是以bytes为单位
    3.不需要指定encoding参数 因为它已经是二进制模式 不需要编码
   
二进制与文本模式针对文件路径是否存在的情况下 规律是一样的!!!

文件的诸多方法

1.read()
	一次性读取文件内容 并且光标停留在文件末尾 继续读取则没有内容
    并且当前文件内容比较多的时候 该方法可能造成计算机内存溢出
    括号内可以填写数字 在文本模式下 表示读取几个字符

2.for循环
	一行行读取文件内容 避免内存溢出现象产生
    
3.readline()
	一次只读取一行内容
    
4.readlines()
	一次性读取文件内容 会按照行数组织成列表的一个个数据值
    
5.readable()
	判断文件是否具有读数据的能力
    
6.write()
	写入数据
    
7.writeable()
	判断文件是否有写数据的能力
    
8.writelines()
	接收一个列表 一次性将列表中所有的数据值写入
    
9.flush()
	将内存中文件数据立刻刷到硬盘上 等价于ctrl + s

文件内光标的移动

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.read(2).decode('utf8'))
    # f.seek(-1,2)
    #print(f.tell()) # 返回光标距离文件开头产生的字节数
    """
    seek(offset, whence)
        offset是位移量 以字节为单位
        whence是模式   0  1  2
            0是基于文件开头
                文本和二进制模式都可以使用
            1是基于当前位置
                只有二进制模式可以使用
            2是基于文件末尾
                只有二进制模式可以使用
    """
    #print(f.read(3).decode('utf8'))

文件内光标移动案例(了解)

import time

with open(r'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('utf8'), end='')

计算机硬盘修改数据的原理(了解)

硬盘写数据可以看成是在硬盘上刻字 一旦需要修改中间内容 则需要重新刻字
因为刻过的字不能从中间分开

硬盘删除数据的原理
	不是直接删除而是改变状态 等待后续的覆盖才会被真正删除

文件内容修改(了解)

 修改文件内容的方式1:覆盖写
with open(r'a.txt', 'r', encoding='utf8') as f:
     data = f.read()
with open(r'a.txt', 'w', encoding='utf8') as f1:
     f1.write(data.replace('jason', 'tony'))

        
        
        
 修改文件内容的方式2:换地写
'''先在另外一个地方写入内容 然后将源文件删除 将新文件命名成源文件'''
import os

with open('a.txt', 'r', encoding='utf8') as read_f, \
        open('.a.txt.swap', 'w', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('tony', 'kevinSB'))

        

os.remove('a.txt')  # 删除a.txt
os.rename('.a.txt.swap', 'a.txt')  # 重命名文件

作业

1.编写简易版本的拷贝工具
     自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
     任何类型数据皆可拷贝
     ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
# 1.获取想要拷贝的文件路径
source_file_path = input('请输入你想要拷贝的路径:').strip()
# 2.获取目标文件的路径
target_file_path = input('请输入你想要拷贝到哪个地方的路径:').strip()
# 3.打开第一个文件路径 读取内容写到第二个文件路径中
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:
        write_f.write(line)
        
2.利用文件充当数据库编写用户登录、注册功能
  文件名称:userinfo.txt
  基础要求:
  		 用户注册功能>>>:文件内添加用户数据(用户名、密码等)
       用户登录功能>>>:读取文件内用户数据做校验
      ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
  拔高要求:
       用户可以连续注册
      用户可以多账号切换登录(多用户)  文件内有多个用户信息
      ps:思考多用户数据情况下如何组织文件内数据结构较为简单
    提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
        
# 1.获取用户数据
while True:
    print("""
        1.注册功能
        2.登录功能
    """)
    choice = input('请选择你想要执行的功能编号:').strip()
    if choice =='1':
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        # 2.校验用户名是否存在
        with open(r'userinfo.txt','r',encoding='utf8')as f:
            for line in f:
                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}注册成功')
    if choice =='2':
        # 1.获取用户名和密码
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        # 2.打开文件读取内容并校验
        with open(r'userinfo.txt','r',encoding='utf8')as f:
            for line in f:
                real_name,real_pwd = line.split('|')
                if real_name == username and real_pwd.strip('\n') == password:
                    print('登陆成功')
                    break
            else:
                print('用户名或密码错误')
    else:
        print('没有该功能编号')
posted @ 2022-10-09 18:31  Super小赵  阅读(76)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************