关于操作文件

时间:2022-11-13 09:31:46

打开方式

方式一:

  f = open()

   参数常用对应位置  文件地址   mode=相关模式   打开的编码格式encoding=

  最后一定要

  f.close

  在对文件进行关闭后对f的相关操作都会无效化

 

方式二:

  with open() as f:    和f=open相比省略了f.close()

   参数常用对应位置  文件地址   mode=相关模式   打开的编码格式encoding=

  这边的文件位置 考虑到字符串转义问题 \ 需要 \\ 或者直接在字符串之前加 r

          如果当前打开文件和执行文件在一个文件夹(不包括子文件夹) 可以以相对位置直接文件名打开

 

操作方法

.read()  读取打开文件的内容 可以跟位置参数 读取对应的是几个单位 比如t模式读取一个文字单位 ,b模式读取一个字节单位

.write()  写入文件的内容,后面参数为写入文件内容

.writeable()  判断是否可写 返回值True False

.readable()  判断是否可读 返回值True False

.readlines()  读取所有的行的内容 最后换回形式为一个字典 列入 ['jinpan','python','play']

.readline()  读取文件的一行内容,通常用于for循环中循环读取

.writelines()  writelines(list)为写入方式,函数writelines可以将list写入到文件中,但是不会在list每个元素后加换行符,所以如果想每行都有换行符的话需要自己再加上。

.
truncate()  跟截断的字节数  保留文件对象截断字节数量的
.tell()  查看光标移动了多少位 bytes

.flush()  将内存中的文件内容直接刷到硬盘
.seek()  offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
  
      whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
 

 

文件的操作模式

默认的文件模式都为t模式 t为文本模式,该模式中字符串为一个单位,字母数字也属于一个单位

r 

以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

个人理解:为读取模式该模式下读取的为文本模式的相关内容  若文件读取时候文件不存在会报错

rb

以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

个人理解:为二进制字节的读取模式 该模式下读取的为字节(bytes)模式下的相关内容,在这模式里比如编码格式为utf8,那么一个文字对应3个字节,1个字母对应1个字节

w

打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

个人理解:为文本的写入模式 不过为覆盖写入 

wb

以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

个人理解:为二进制的写入模式 不过为覆盖写入  通常用于储存二进制文件:照片视频

a

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

个人理解:追加文本模式 在文本末尾添加内容

ab

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

个人理解:追加二进制字节写入模式  在文本末尾添加

r+

打开一个文件用于读写。文件指针将会放在文件的开头。

个人理解:可读可写文本  不过该模式会覆盖相关的原位置内容,写入起始点在文件开头

rb+

以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

个人理解:可读可写bytes  不过该模式会覆盖相关的原位置内容,写入起始点在文件开头

w+

打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

个人理解:可读可写文本  该模式会在with open 环节就 直接清空文件内容然后写入新内容

wb+

以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

个人理解:可读可写二进制  该模式会在with open 环节就 直接清空文件内容然后写入新内容
a+  对应a 它可读
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 

操作文件的一些疑难困惑点:

对于t模式下一个文字1个单位 b模式下3个bytes  read() 读取时候要根据相关的模式进行判断读取数量 否则报错

文件模式处于 b模式时候不需要encoding的参数

seek() 和 read()  方法搭配使用的时候需要注意seek的偏移单位始终是字节 seek偏移单位也可以取负值 0为开头位置 1为指针当前位置 2为结尾位置

         不合理的指针偏移和修改会导致文章乱码

read()  b模式读取相关单位 (也和光标位置有关系)读取单位量 不符合当前格式规范 会报错

    

操作文件的一些实例:

实时监测文件动态

监测文件内容(Ps:使用时候要注意,要先运行监测文件内容代码后再进行修改文件代码)

with open(r'test01.txt','rb') as f:
    # 先将光标移动到文件末尾
    f.seek(0,2)
    while True:
        res = f.readline()
        # 查看光标移动了多少位 bytes
        # print(f.tell())
        if res:
            print("新增的文件内容:%s"%res.decode('utf-8'))
            # 说明有人操作当前文件
        # else:
        #     # 说明文件没有被任何人操作
        #     print('暂无其他人操作该文件')

修改文件内容

import time
res = time.strftime('%Y-%m-%d %X')
# print(res,type(res))
#
with open(r'test01.txt','a',encoding='utf-8') as f:
    f.write('%s egon给jason发了1个亿的工资\n'%res)

 

截断案例:

with open(r'test','a',encoding='utf-8') as f:
    f.truncate(6)  # 接收的字节的长度 整型
    # 保留0~6字节数 后面的全部删除(截断)

 

修改文件:(各有优点)

方法1

# 修改文件
# 先将数据由硬盘读到内存(读文件)
# 在内存中完成修改(字符串的替换)
# 再覆盖原来的内容(写文件)
# with open(r'test02.txt','r',encoding='utf-8') as f:
#     data = f.read()
#     print(data)
#     print(type(data))
#
# with open(r'test02.txt','w',encoding='utf-8') as f:
#     res = data.replace('egon','jason')
#     print(data)
#     f.write(res)

"""
优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
"""

方法2

# 创建一个新文件
# 循环读取老文件内容到内存进行修改  将修改好的内容写到新文件中
# 将老文件删除  将新文件的名字改成老文件名
import os


with open(r'test02.txt','r',encoding='utf-8') as read_f,\
        open(r'test02.swap','a',encoding='utf-8') as write_f:
    for line in read_f:
        new_line = line.replace('jason','egon')
        write_f.write(new_line)
os.remove('test02.txt')
os.rename('test02.swap','test02.txt')


"""
优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件



每日默写
    修改文件的两种方式
    加上你自己的逻辑思维
"""