• 文件操作


    文件操作

    文件操作分为读、写、修改。

     一: 文件处理的三个步骤

    1. 打开文件拿到文件对象(文件对象====>操作系统打开文件====>硬盘)
    f=open(r'文件的路径',mode='文件的打开模式',encoding='字符编码') #绝对路径:C:ac.txt,/a/b/c/c.txt 相对路径:相对于当前执行文件所在的文件夹为起始点进行查找b/c/a.txt

    2. 操作文件:读/写

    # f.read()
    # f.readlines()
    # f.readline()
    # f.readable()

    3. 向操作系统发送指令关闭文件,回收操作系统资源

    # f.close()

     二、上下文管理

    with open(r'D:xxxx',mode='rt',encoding='utf-8') as f:
    # data=f.read()
    # print(data)
    # print('='*100)
    name=input('>>: ')
    for line in f:
    print(line)

    一、 基本概念

    打开文件的模式有三种纯净模式:r(默认的) w a

    控制操作文件内容格式的两种模式:t(默认的) b

    大前提: tb模式均不能单独使用,必须与纯净模式结合使用
     t文本模式:
    1. 读写文件都是以字符串为单位的
    2. 只能针对文本文件
    3. 必须指定encoding参数
    b二进制模式:
    1.读写文件都是以bytes/二进制为单位的
    2. 可以针对所有文件
    3. 一定不能指定encoding参数

    二、打开文件模式详解

    1. r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头

    # with open('a.txt',mode='rt',encoding='utf-8') as f:
    # print(f.readlines())

    # 用户认证功能

    # inp_name=input('请输入你的名字: ').strip()
    # inp_pwd=input('请输入你的密码: ').strip()
    # with open(r'db.txt',mode='rt',encoding='utf-8') as f:
    # for line in f:
    # # 把用户输入的名字与密码与读出内容做比对
    # u,p=line.strip('
    ').split(':')
    # if inp_name == u and inp_pwd == p:
    # print('登录成功')
    # break
    # else:
    # print('账号名或者密码错误')

    2. w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头

    # with open('b.txt',mode='wt',encoding='utf-8') as f:
    # print(f.writable())
    # print(f.readable())
    # f.write('你好
    ')
    # f.write('我好
    ') # 强调:在文件不关闭的清空下,后写的内容一定跟着前写内容的后面
    # f.write('大家好
    ')
    # f.write('111
    222
    333
    ')
    # lines=['1111','22222','33333']
    # for line in lines:
    # f.write(line)
    # f.writelines(lines)

     注册功能:

    # name=input('username>>>: ').strip()
    # pwd=input('password>>>: ').strip()
    # with open('db1.txt',mode='at',encoding='utf-8') as f:
    # info='%s:%s
    ' %(name,pwd)
    # f.write(info)

    3. a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾

    # with open('c.txt',mode='at',encoding='utf-8') as f:
    # f.write('44444
    ')
    # f.write('55555
    ')
    # print(f.readable())
    # print(f.writable())

    # r+ w+ a+

    # with open('a.txt',mode='r+t',encoding='utf-8') as f:
    # print(f.readable())
    # print(f.writable())
    # print(f.readline())
    # f.write('你好啊')

    # b: 读写都是以二进制为单位

    # with open('b.txt',mode='rb') as f:
    # data=f.read()
    # # print(data,type(data))
    # print(data.decode('utf-8'))
    
    # with open('1.png',mode='rb') as f:
    # data=f.read()
    # print(data)
    # with open('d.txt','wb') as f:
    # f.write('你好'.encode('gbk'))
    
    
    # with open('1.png',mode='rb') as f:
    # data=f.read()
    #
    # with open('2.png',mode='wb') as f:
    # f.write(data)
    
    # 拷贝工具
    src_file=input('源文件路径: ').strip()
    dst_file=input('目标文件路径: ').strip()
    with open(r'%s' %src_file,mode='rb') as read_f,open(r'%s' %dst_file,mode='wb') as write_f:
    for line in read_f:
    # print(line)

    须知一:

    硬盘空间无法修改,硬盘中的数据更新都是用新的内容覆盖旧的内容# 内存控制可以修改

    # with open('a.txt','r+t',encoding='utf-8') as f:
    #     f.seek(4,0)
    #     print(f.tell())
    #     f.write('我擦嘞')

    须知二:

    文件对应的是硬盘空间,硬盘不能修改应为文件本质也不能修改,
    我们看到文件的内容可以修改,是如何实现的呢?
    大的的思路:将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘
    具体的实现方式分为两种:
    1. 将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
    优点: 在文件修改过程中同一份数据只有一份
    缺点: 会过多地占用内存

    # with open('db.txt',mode='rt',encoding='utf-8') as f:
    # data=f.read()
    
    # with open('db.txt',mode='wt',encoding='utf-8') as f:
    # f.write(data.replace('kevin','SB'))

    2. 以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
    优点: 不会占用过多的内存
    缺点: 在文件修改过程中同一份数据存了两份

    import os
    
    with open('db.txt',mode='rt',encoding='utf-8') as read_f,
    open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
    for line in read_f:
    wrife_f.write(line.replace('SB','kevin'))
    
    os.remove('db.txt')
    os.rename('.db.txt.swap','db.txt')

    大前提:文件内指针的移动是Bytes为单位的,唯独 t 模式下的read读取内容个数是以字符为单位。

    # f.read(3)
    # with open('a.txt',mode='rt',encoding='utf-8') as f:
    # data=f.read(3)
    # print(data)
    
    # with open('a.txt',mode='rb') as f:
    # data=f.read(3)
    # print(data.decode('utf-8'))

     f.seek(指针移动的字节数,模式控制): 控制文件指针的移动
    模式控制:
    0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
    1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
    2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的

    强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

    f.tell()查看文件指针当前距离文件开头的位置

     0模式详解
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        f.seek(4,0)
        print(f.tell())
        print(f.read())
    with open('a.txt',mode='rb') as f:
        f.seek(4,0)
        f.seek(2,0)
        print(f.tell())
        print(f.read().decode('utf-8'))
    # with open('a.txt',mode='rt',encoding='utf-8') as f:
    # f.seek(5,0)
    # print(f.read())

     1、模式详解

    # with open('a.txt',mode='rb') as f:
    # f.seek(3,1)
    # print(f.tell())
    # f.seek(4,1)
    # print(f.tell())
    # print(f.read().decode('utf-8'))

    2、模式详解

    # with open('a.txt',mode='rb') as f:
    # f.seek(-9,2)
    # data=f.read()
    # print(data.decode('utf-8'))
    
    # tail -f access.log
    with open('access.log',mode='rb') as f:
    f.seek(0,2)
    while True:
    line=f.readline()
    if len(line) == 0:
    # 没有内容
    continue
    else:
    print(line.decode('utf-8'),end='')

     

    Time the study pain is temporary,has not learned the pain is life-long.
  • 相关阅读:
    Ubuntu下虚拟机卡顿
    C函数重载
    ACPI电源状态定义
    /dev/random生成随机数慢的问题
    GCC强制静态库链接未使用的函数、变量
    cmake交叉编译问题
    cmake语法
    CentOS安装OpenOCD
    LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演
    BZOJ4710 [Jsoi2011]分特产 容斥
  • 原文地址:https://www.cnblogs.com/wanlei/p/9787381.html
Copyright © 2020-2023  润新知