文件处理

文件的处理

目录
一 、文件操作简介

  • 1.文件操作的含义
  • 2.使用代码操作文件的基本流程
  • 3.注意事项

二 、文件的读写模式

  • 1.只读模式(r)
  • 2.只写模式(w)
  • 3.只追加模式(a)
  • 4.+模式

三 、 文件的操作模式

  • 1.文本模式(t)
  • 2.二进制模式(b)
  • 3.文本模式与二进制模式的比较

四 、 文件的诸多操作方法

  • 1.读操作
  • 2.写操作
  • 3.其他操作

五 、 文件内指针的移动

  • 在文件内指针移动的前提
  • 实现指针在文件中移动的操作

六 、 文件数据的修改

  • 1.机械硬盘存储数据的原理
  • 2.文件数据修改———覆盖写
  • 3.文件数据修改———重命名

文件操作简介

  • 文件操作的含义
    通过编写代码的方式自动操作对文件的读写

  • 使用代码操作文件的基本流程
    1.打开文件,向操作系统发起调用open(...)指令,操作系统打开该文件所对应的硬盘空间,将一个文件对象赋值给一个变量
    f = open('所需打开的文本' , ‘r' , encoding = 'utf-8') # 默认打开模式为 r

    2.调用文件对象下的读/写方式,操作系统将其转换为读/写硬盘的操作
    info = f.read( )
    3.对操作系统发出关闭文件的请求,回收系统资源
    f.close( )

  • 注意事项
    由于使用 f = open( ) 后必须要使用f.close( )来回收系统资源。而人们经常在打开文件后对文件不管不顾,从而使文件一直处于打开的状态,造成占用资源。
    因此,python诞生了with用法,使用with方法打开文件后自动关闭文件,也可同时打开多个文件(用逗号隔开就行)避免了资源的浪费。

同时打开多个文件的操作:
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
	data = read_f.read()
	write_f.write(data)

针对文本文件时,可能存在特殊含义,在其字符串前面加 字母 r 即可取消特殊含义

文件的读写模式

  • 只读模式( r )
    在此模式下打开文件只能读取内容,不能做其他操作
1. 若是文本路径存在,则会打开文件等待读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()
f.write('123')
2. 若是文本路径不存在,则会报错
with open (r'b.txt', 'r', encoding = 'utf-8') as f :
pass    # 补全python语法
  • 只写模式( w )
    在此模式下打开文件只能写入内容,不能做其他操作
只写模式(w)在文件不存在时会创建新的文件,文件存在会做清空处理,然后再等待写入文件的内容
with open(r'a.txt', 'w', encoding='utf8') as f:
     f.write('111\n222\n333\n')
     f.write('德玛西亚')
    在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
    文件关闭,重新打开则会清空文件内容
  • 只追加模式( a )
只追加模式( a ) 在文件不存在时会创建空文档,文件存在会在文件信息的末尾添加待写入的内容
 with open(r'b.txt', 'a', encoding='utf8') as f:
       f.write('干饭人,干饭魂,干饭都是人上人\n')
  • +模式
    r+ w + a + : 可读可写
    常见的情况下,只单纯使用r/w/a,一般不用可读可写模式

控制文件的操作模式

文件的操作模式 即控制文件读写内容的模式,有 t 模式和 b 模式。这两种模式不能单独使用,必须与r/w/a之一相结合使用

  • 文本模式 ( t )
  1. 只能操作文本文件
  2. 必须指定encoding参数
  3. 读写都是以字符为单位的
  • 二进制模式( b )
  1. 能够操作所有类型的文件
  2. 不需要指定参数
  3. 读写都是字字节为单位
  • 文本模式与二进制模式的比较
  1. 在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码
  2. 针对非文本文件(如图片、视频、音频等)只能使用b模式

文件的操作方法

  • 读操作
read() 一次性读取所有内容,执行完该操作后,文件指针会移动到文件末尾,继续读则为空
readline() 只读取一行内容
readlines() 读取每一行内容,存放于列表中
readable() 判断当前文件是否可读
  • 写操作
write() 填写文件内容
writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
writable() 判断当前文件是否可写
  • 其他操作
closed     文件是否关闭
encoding   如果文件打开模式为b,则没有该属性
flush()    立刻将文件内容从内存保存到硬盘

文件内指针的移动

  • 在文件内指针移动的前提
    文件内指针的移动基本上都是以字节(bytes)为单位的,只有在t模式下的read(n)中的 n 是以字符为单位的

  • 实现指针在文件中移动的操作
    文件的指针的移动都是由读/写操作触发,当要读取文件中的某一特定数据时,需要采用f.seek方法主动控制文件内指针的移动

    使用 tell ( ) 方法可获取光标移动的字节数

    seek(offset,whence)
    offset 控制光标移动的位移量(字节)
    whence 模式
    0 从文件开头开始移动,移动了几个个字节
    1 从文件当中指针所表示的位置开始技术,前面移动了多少,就是移动了多少字节
    2 直接跳到文件末尾,从文件末尾开始看移动多少字节(为负则为往前移动的字节数)

文件数据的修改

  • 机械硬盘存储数据的原理
  1. 数据的修改 其实是覆盖写
  2. 数据的删除 占有态自由态
  • 文件数据修改———覆盖写
    先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
with open(r'demo.txt','r',encoding='utf8') as f:
    data = f.read()
new_data = data.replace('DSB','NB')
with open(r'demo.txt','w',encoding='utf8') as f1:
    f1.write(new_data)

优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出

  • 文件数据修改———重命名
    先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中
    再将原文件删除 将新的文件重命名为原文件
import os

with open('demo.txt', 'r', encoding='utf8') as read_f, \
        open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
    for line in read_f:
        wrife_f.write(line.replace('NB', 'SB'))
os.remove('demo.txt')  # 删除文件
os.rename('.demo.txt.swap', 'demo.txt')  # 重命名文件

优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘

作业

  • 用函数的形式完成登录/注册程序
f = open(r'userinfo.txt', 'r', encoding='utf8')  # 打开存账号的文件
res = f.read()  # 读取文件中的内容
user_list = res.split()  # 分割字符串,返回列表
info = {}  # 定义一个空字典
for i in user_list:
    name = i.split(',')[0]
    paw = i.split(',')[1]
    info[name] = paw  # 循环列表,取出列表中的值存入字典

flag = True


def cyclic():       # 创建一个用户登录程序函数
    while flag:
        print("""
        --------------用户登录/注册---------------
                   1.登录
                   2.注册
                   3.退出程序
        """)
        choice = input('请输入你的选择:').strip()
        return choice


def register(name, paw):          # 用户注册
    with open(r'userinfo.txt', 'a', encoding='utf8') as f:  # 查看文件信息
        temp = '\n' + name + ',' + paw
        f.write(temp)  # 按照这个格式写入文件


def login(name, paw):             #用户登录
    with open(r'userinfo.txt', 'r', encoding='utf8') as f:  # 输入追加的信息
        register = name + ',' + paw
        if register in res:
            return True     # 登录成功
        else:
            return False    # 登录失败

def contrast(name, paw, paw1):        # 判断是否可注册
    if paw != paw1:
        print('两次密码不一致!')
    elif name == '' or paw == '':
        print('用户名密码不能为空!')
    elif name in info:
        print('用户名已存在')
    else:
        print('恭喜注册成功!')


while flag:
    choice = cyclic()         # 调用登录程序的相应函数
    if choice == '1':
        print('-------------请入登录界面----------------')
        name = input('请输入你的用户名:').strip()
        paw = input('请输入你的密码:').strip()
        i = login(name, paw)            # 调用登录函数
        if i:
            print('登录成功')
        else:
            print('用户名或密码错误')
    elif choice == '2':
        print('--------------进入注册界面----------------')
        name = input('请输入用户名:').strip()
        paw = input('请输入密码:').strip()
        paw1 = input('请再次输入密码:').strip()
        contrast(name,paw, paw1)        # 调用对比
        register(name, paw)             # 进行添加
    elif choice == '3':
        print('欢迎下次使用')
        flag = False
    else:
        print('请输入正确的指令')

image

posted @ 2022-06-30 21:09  Nirvana*  阅读(53)  评论(0)    收藏  举报