文件操作

文件操作

什么是文件?   

  文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)

代码如何操作文件   

  open()     

    打开文件

    三步走:
      1.利用关键字open打开文件
      2.利用其它方法操作文件
      3.关闭文件
    

  文件路径

    1.相对路径

      相对于当前文件所在的对应的位置  (随着参照文件位置的改变相对位置一定改变)

    2.绝对路径

      文件的ip地址 (即文件在硬盘中存储的位置,不管查找的对象是谁都可以在硬盘相应位置找到)

      eg:D:\py20\day08\a.txt

    3.路径中的特殊含义取消       

      路径中出现了字母与斜杠的组合产生了特殊含义如何取消
      在路径字符串前面加一个r
      r'D:\py20\day08\a.txt'

open('a.txt')
open(r'D:\py20\day08\a.txt')

res = open('a.txt', 'r', encoding='utf8')
print(res.read())
res.close()  # 关闭文件释放资源
"""
open(文件路径,读写模式,字符编码)
    文件路径与读写模式是必须的
    字符编码是可选的(有些模式需要编码)
"""

# with上下文管理(能够自动帮你close())
with open(r'a.txt','r',encoding='utf8') as f1:  # f1=open() f1.close()
    print(f1.read())
"""以后代码操作文件 推荐使用with语法"""

 

文件读写模式

  """
  补全语法结构 没有实际含义
  pass
  ...
  """

 

  r 只读模式(只能看不能改)

# 路径不存在:直接报错
with open(r'b.txt', 'r', encoding='utf8') as f:
    pass
# 路径存在
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 读取文件内所有的内容
f.write('123')  # 写文件内容

 

  w 只写模式(只能写不能看)

# 路径不存在:路径不存在自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
    pass

# 路径存在:1.会先清空文件内容  2.再执行写入操作
with open(r'a.txt', 'w', encoding='utf8') as f:
      f.read()
      f.write('hello world!\n')
      f.write('hello world!\n')
      f.write('hello world!\n')

 

  a   只追加模式(追加内容)

# 路径不存在:路径不存在自动创建
with open(r'b.txt', 'a', encoding='utf8') as f:
    f.read()  # 报错 提示没有阅读权限
    f.write('嗯嗯嗯')

# 路径存在:1.不会清空文件内容  2.不可以看里面的文件  3.可以执行写入操作
with open(r'a.txt', 'a', encoding='utf8') as f:
    f.read()  # 报错 提示没有阅读权限
    f.write('嗯嗯嗯')

  """

    小总结
    我们所学习的r w a读写模式都只能操作文本文件
  """

 

文件操作方法

  1.读系列.read()

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 一次性读取文件内所有的内容
    print(f.readline())  # 每次只读文件一行内容
    print(f.readlines())  # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容
    print(f.readable())  # 判断当前文件是否具备读的能力

 

  2.写系列.write()

with open(r'a.txt','w',encoding='utf8') as f:
    f.write('克服一切困难 奥利给!')  # 往文件内写入文本内容
    f.write(123)  # 写入的内容必须是字符串类型
    f.writelines(['jason','kevin','tony'])  # 可以将列表中多个字符串元素全部写入
    print(f.writable())  # True
    print(f.readable())  # False
    f.flush()  # 直接将内存内文件数据刷到硬盘 相当于ctrl+s

 

文件优化操作

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 一次性读取文件内所有的内容
    print(f.read())  # 一次性读取文件内所有的内容
    print(f.read())  # 一次性读取文件内所有的内容
    """
    1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容
    2.该方法在读取大文件的时候 可能会造成内存溢出的情况
        解决上述问题的策略就是逐行读取文件内容
    """
    for line in f:  # 文件变量名f支持for循环  相当于一行行读取文件内容
        line
    '''
    以后涉及到多行文件内容的情况一般都是采用for循环读取
    '''

 

二进制模式读写操作

with open(r'a.txt','rb') as f:
    print(f.read())
    print(f.read(6).decode('utf8'))


with open(r'a.txt','r',encoding='utf8') as f:
    print(f.read())
    print(f.read(4))

"""
read()  括号内可以放数字
    在t模式下表示字符个数
    在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""

 

文件内光标的移动 

  .seek()

    .seek(offset,whence)

      offset表示位移量

        始终是以字节为最小单位

        正数从左往右移动

        负数从右往左移动

      whence表示模式

        0:以文件开头为参考系(支持tb两种模式)

        1:只支持b模式 以当前位置为参考系

        2:只支持b模式 以文件末尾为参考系

with open(r'b.txt', 'rb') as f:
    print(f.read(4).decode('utf8'))
    print(f.tell())  # 查看光标移动了多少个字节
    f.seek(3, 1)
    print(f.read().decode('utf8'))
"""
控制文件内光标的移动  f.seek()
f.seek(offset,whence)
    offset表示位移量
        始终是以字节为最小单位
            正数从左往右移动
            负数从右往左移动
    whence表示模式
        0:以文件开头为参考系(支持tb两种模式)
        1:只支持b模式 以当前位置为参考系
        2:只支持b模式 以文件末尾为参考系
"""

 

  小练习:实现动态查看最新一条日志的效果

import time
with open('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('utf-8'), end='')

 

文件的内容修改

  方式1 覆盖

# 方式1 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
    data = f.read()
    print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
    new_data = data.replace('tony','jason')
    f1.write(new_data)

 

  方式2 新建

# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原文件
os.rename('c.txt.swap', 'c.txt')  # 重命名文件

"""
自己总结两种方式的优缺点
"""

 

 

END

  

posted @ 2021-11-11 19:38  Snails蜗牛  阅读(44)  评论(0编辑  收藏  举报