zoukankan      html  css  js  c++  java
  • 文件操作

    文件是操作系统给用户/应用程序的一种虚拟单位,文件直接映射的是硬盘空间。
    应用程序  >>>(发送指令)>>>   操作系统  >>>(操控硬件)>>>  硬盘数据

     ps:文件路径:

          绝对路径:从磁盘开始找到文本文件的位置

          相对路径:文本文件与执行文件所在同一文件夹

    一.操控文件:

      普通方法:

      f = open()  # 向操作系统发送请求,发开文件
      f.read()  # 对文件进行的操作
      f.close()  # 关闭文件,打开的文件会占据应用程序和操作系统内存空间,所以操作完文件后要关闭文件

      推荐方法:

        with open(r'文件地址',mode='打开方法',encoding=' ') as f(f是变量名):
        print(f) # f是文件对象(句柄)
        f.read # 想操作系统发送请求,对问价进行操作
        print(f.read) # 若文件是可读类型,打印出整个文件的内容
        
        代码块1
        代码块1
        ...    # 当代码快执行完后,自动关闭文件,优化内存,无序手动关闭

    二.处理文件的的模式:

      文件的打开方式

      r 只读模式:当文件存在,读出文件内容,当文件不存在,报错。
      w 只写模式:当文件存在,清空文件,光标移动到文件开头,当文件不存在则创建文件。
      a 追加写模式:当文件存在,光标移动到文件末尾,文件不存在创建文件
      r+ 可读可写,当文件存在,可读写文件,文件不存在则报错
      w+ 可写可读,当文件存在,清空文件,文件不存在创建文件
      a+ 可写可读,当文件存在,光标移动到文件末尾,不存在则创建

      文件的打开格式

      t 文本文件:

          1.文件内容都是以字符串为单位的

          2.只能针对文本

          3.必须指定encoding参数

        b 二进制模式:

          1.读写文件都是以Bytes/二进制为单位的
          2.针对所有对象
          3.一定不能指定ending参数

    三.内置方法:

    r 模式下的文件处理方法
    with open(r'r_file.txt',mode='rt',encoding='utf-8') as f:
        print(f)  # 文件对象,也叫句柄
        print(f.readable())  # 文件是否可读 Ture
        print(f.writable())  # 文件是否可写 False
        print(f.read())  # 读取整个文件内容 光标停留在最后的位置
        print(f.readline())  # 一行一行读取文件的内容 包括(
    )
        print(f.readline())
        print(f.readlines())  # 读出全部内容,返回的是一个别表,每一行是内容是字符串包括
    
       #readlines 的内部原理是for循环文件,取出的内容添加到列表里
        r_list = []
        for line in f:  # 文件可以别for循环
            r_list.append(line)
        print(r_list)

    w 模式下的文件处理方法: 慎用!!!
    with open(r'D:OldBoy-py文件w_flie.txt',mode='wt',encoding='utf-8') as f:
        print(f)  # 文件对象,也叫句柄
        print(f.readable())  # 文件是否可读 False
        print(f.writable())  # 文件是否可写 True
        f.write('wong
    ')  #  清空整个文件,写入‘wong’
        f.write('wong	')  #  清空整个文件,写入‘wong’
        f.write('wong')  #  清空整个文件,写入‘wong’
        w_list = ['wong	','waller
    ','age','20']
        f.writelines(w_list) # 将列表的内容写到文件,列表里的数据为字符串类型
        for line in w_list:
            f.write(line)
    a 模式下的文件处理方法:
    with open(r'a_flie.txt',mode='at',encoding='utf-8') as f:
        print(f)  # 文件对象,也叫句柄
        print(f.readable())  # 文件是否可读 False
        print(f.writable())  # 文件是否可写 True
        f.write('
    wong
    ')
        f.write('waller')
        a_list = ['wong	', 'waller
    ', 'age', '20']
        f.writelines(a_list)

    read() 括号内的数:

    #文件seek.txt
    #内容: 
          用户名waller
    123是密码 #在‘rt’模式下,read括号内的数表示的是字符的个数,除此之外均表示字节数 with open(r'seek.txt',mode='rt',encoding='utf-8') as f: res = f.read(3) print(res) # >>> 用户名 #在‘rb’模式下,read括号内的数表示的是字节数 with open(r'seek.txt','rb') as f: res = f.read(10) # 读的是10个字节 Bytes print(res) # >>> b'xe7x94xa8xe6x88xb7xe5x90x8dw' res_str = res.decode('utf-8') # 将二进制解码成字符串形式 # res_str = str(res,encoding='utf-8') # 将二进制解码成字符串形式 print(res_str) # >>> 用户名w

    文件内光标移动seek

    # f.seek(offset,whence)
    #offset:光标的相对偏移量,移动的位数 ,只能是字节数
    #whence:
    #       0 参照文件的开头,t b 模式均可以使用
    #       1 参照光标当前的位置,b 模式可以使用
    #       2 参照文件的末尾,b 模式可以使用
    
    with open(r'seek.txt','rt',encoding='utf-8') as f:
        print(f.read(1))  # >>> 用
        f.seek(6,0)  # 光标从文件开头移动6个字节的位置
        print(f.read(1))  # >>> 户 从第6个字节的位置向后读取一个字符
    
    with open(r'seek.txt','rb') as f:
        res = f.read(3)
        # rb模式下读的是二进制的字节数,注意如果有汉字要把一个汉字完整的字节数都读出来,否则报错
        print(res)  # >>> b'xe7x94xa8'
        print(str(res,encoding='utf-8'))  # >>> 用
        f.seek(9,0)
        print(f.read(3))  # >>> b'wal'
    
    
    with open(r'seek.txt','rt',encoding='utf-8') as f:
        print(f.read(1))  # >>> 用
        f.seek(0,1)  # 参照当前光标的位置移动0个位置
        print(f.read(1))  # >>> 户
    
    with open(r'seek.txt','rb') as f:
        print(f.read(3))  # >>> b'xe7x94xa8'
        print(f.read(3).decode('utf-8'))  # >>> 户
        f.seek(3,1)  # 参照光标当前的位置把光标移动3个字节
        print(f.read(3))  # >>> b'wal'
        print(str(f.read(3),encoding='utf-8'))  # >>> ler
    
    with open(r'seek.txt','rb') as f:
        f.seek(-6,2)  # 光标参照末尾向前移动个字节
        ser = f.read(6)
        print(ser)  # >>> b'xe5xafx86xe7xa0x81'
        print(ser.decode('utf-8'))  # >>> 密码

    四.应用

    文件内容监测:

    with open(r'文件内容检测.txt','rb')as f:
        f.seek(0,2)  # 把光标移动到文件末尾,只能b模式
        while True:  # 循环判断
            res = f.readline()  # 打印新增的一行内容
            if res:  # 判断是否新增了内容
                print(res.decode('utf-8'))  # 如果新增了则打印出新增的内容

    截断文件内容

    with open(r'文件截断.txt','a',encoding='utf-8') as f:  # 也可以用 r+
        f.truncate(3)  # >>> 用
        # 截取文件3个字节的内容,将文件内推清空,并把截取的内容添加到该文件内

    文件修改

    '''
    方法一:
    1.将文件由硬盘读到内存
    2.在内存中操作文件,此时不影响硬盘里的文件
    3.改写覆盖原文件
    
    '''
    with open(r'文件修改.txt','rt',encoding='utf-8') as f:  # 由硬盘读到内存
        res = f.read()  # 拿到文件的内容,赋值给一个变量
        print(res)
    with open(r'文件修改.txt','w',encoding='utf-8') as f:
        data = res.replace('waller','wong')  # 修改替换文件的内容
        print(data)
        f.write(data)
    
    优点:
    任意时间硬盘上只有一个文件 不会占用过多硬盘空间
    缺点:当文件过大的情况下,可能会造成内存溢出
    '''
    方法二:
    1.创建一个新文件
    2.把原文件的内容一行一行读出来并修改
    3.将修改的内容一行一行添加到新文件里
    4.新文件的名字修改成和源文件一样的名字,并删除原文件
    
    '''
    import  os  # 调用模块
    with open(r'文件修改.txt','rt',encoding='utf-8')as f,
            open(r'新文件修改.txt','at',encoding='utf-8') as j:
        for line in f:
            res = line.replace('waller', 'wong')
            j.write(res)
    os.remove('文件修改.txt')
    os.rename('新文件修改.txt','文件修改.txt')

    优点:内存中始终只有一行内容 不占内存
    缺点:再某一时刻硬盘上会同时存在两个文件
  • 相关阅读:
    The usage of Markdown---杂谈:缩进/换行/分割线/注释/文字颜色
    insert into,insert into select,replace into,replace into select,insert ignore into,on duplicate key update
    mysql使用指南
    openssl使用
    黑名单
    zsh+iTerm2+ powerline+oh-my-zsh+ agnoster
    mac安装brew软件管理工具
    mysql性能优化
    numactl
    vscode
  • 原文地址:https://www.cnblogs.com/waller/p/11140524.html
Copyright © 2011-2022 走看看