文件相关操作

148 阅读4分钟

文件简介

1.文件的概念
    计算机的读写操作都是在硬盘上完成的,用户无法通过计算机直接操作硬盘上的数据。文件就是操作系统暴露给用户操作计算机硬盘的快捷方式(相当于是中间商)
    打开文件就是将数据从硬盘加载到内存
    保存文件就是将数据从内存写入到硬盘
2.文件操作
    文件操作就是指用python代码来控制文件自动读写
3.代码操作文件
    方式1open('文件路径','读写模式',encoding='字符编码')
            f = open('a.txt','r',encoding='utf8')
            f.close()  #需要调用close
    方式2  with open(文件路径,读写模式,字符编码) as 变量名
            with open('a.txt','r',encoding='utf8') as f:
            print(f)  #子代码运行之后自动调用close
    #注意文件路径中可能含有特殊含义的字符,为不产生歧义,需要在路径字符串的前面加r
4.with 语法
    with支持一次打开多个文件,文件之间逗号隔开
    with open(r'a.txt','r',encoding='utf8')as f1, open (r'b.txt','r',encoding='utf8')as f2

文件读写模式

1. r 只读模式(默认模式)
#若文件路径不存在,则直接报错
    with open(r'a.txt','r',encoding='utf8') as f:
        pass #报错 No such file or directory
#若文件路径存在,则会打开该文件,等待读取。
2. w 只写模式
#若文件路径不存在,则会自动创建该文件
    with open(r'a.txt','w',encoding='utf8') as f:
        f1.write('hello world')
#若文件路径存在,则会清空原文件内容,再等待写入。
3. a 只追加模式(在原文件末尾追加新的内容)
#若文件路径不存在,则会自动创建该文件
    with open(r'a.txt','a',encoding='utf8') as f:
        f1.write('你好 世界')
#若文件路径存在,不会清除文件内容,等待在源文件末尾写入内容。

文件操作模式

1. t模式(文本模式,默认)
    r  -->  rt
    w  -->  wt
    a  -->  at #前文提到的r w a 模式都是rt wt at模式的间歇
    1.只能操作文本文件
    2.必须指定encoding参数(字符编码)
    3.读写都是以字符串为单位
2. b模式(字节模式)
	rb wb ab  必须自己指定  不能省略
    1.能够操作所有类型文件
    2.不需要指定encoding参数
    3.读写都是以字节为单位

文件内置方法

1.read()  一次性读取文件所有内容,光标停留在文件末尾
    with open(r'a.txt','r',encoding='utf8') as f1:
        f1_read = f1.readline()
        print(f1_read)
2.readline()  一次只读一行内容
3.readlines()  按照行的方式读取所有文件内容,读取的值作为列表返回
4.readable()  判断文件是否可读
5.write()  填写文件内容
6.flush()  将内存中的文件数据立刻刷到硬盘上,类似于ctrl + s

文件拷贝练习

file_c = input('请输入您要拷贝的文件路径')
file_v = input('请输入您要拷贝到哪')
with open(fr'{file_c}','rb') as f1, open(fr'{file_v}','ab') as f2:
    read_file = f1.read()
    write_file = f2.write(read_file)

文件内光标的移动

1.read() 方法补充
    with open(r'a.txt','r',encoding='utf8') as a:
        print(a.read(4)) # aaa你  read方法在t模式(文本模式)下,括号内的数字表示读取几个字符
    
    with open(r'a.txt','rb') as b:
        print(b.read(4)) # aaa\xe4  read方法在b模式(二进制模式)下,括号内的数字表示读取几个字节
        print(b.tell())  # 4  tell() 获取文件内光标的移动的字节数
        data = b.read(5)
        print(data)  # aaa\xe4\xbd
        print(data.decode())  # 报错  一个汉字占三个字节  编译器无法解码不全的汉字   
2.代码控制光标移动  seek(offset,whence)
	f.seek(指针移动的字节数,模式选择)
模式控制:
    0:默认模式,基于文件开头移动多少字节
    1:基于光标当前的位置移动多少字节
    2:基于文件末尾移动多少字节  # 1和2只能在字节模式下
    with open(f'a.txt','rb') as f:
        f.seek(3,0)
        print(f.read())
        f.seek(3,1)
        f.seek(7,2) 
3.练习:实现动态查看最新日志的效果        
    import time
    with open('access.log', '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.覆盖写
    	先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
	2.重命名
    	先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中
       再将原文件删除 将新的文件重命名为原文件
 
# 方式1:覆盖写
# 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)
"""
优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出
"""
# 方式2:重命名
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')  # 重命名文件
"""
优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能)   也可能是在内存中创建没有刷到硬盘
"""