python文件操作

python文件操作

文件的概念

文件就像是系统呈现在我们面前的能够使用硬盘的快捷方式,文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以JPEG格式保存并且文件扩展名为.jpg)

graph TD A(硬盘)-->B(双击文件打开) B-->|文件从硬盘加载到内存|C(内存)

双击打开文件操作

graph TD A(内存)-->B(ctrl+s) B-->|文件从内存刷入硬盘|C(硬盘)

ctrl+s保存文件操作

python中利用代码打开文件的方式

方法1:
f = open(文件路径,读写模式,encoding='utf8')
        f.close()
    在该方法中打开的文件需要输入代码才可以结束调用
方法2:
with open('a.txt', 'r', encoding='utf8') as f1:
        	with子代码块
    在第二中方法中,with子代码块执行完毕后会自动关闭打开的文件,不需要输入额外的代码
PS:在python中“\”与其他字母的联用会有特殊效果,如果在输入的文件路径中有这种情况出现,
就会导致文件路径混乱,为避免该情况,我们可以在文件路径前加字母'r'来区分
with open(r'a.txt', 'r', encoding='utf8') as f1:
        	with子代码块
with语法的使用可以一次打开多个文件,只需用逗号隔开即可:
	with open() as f1,open() as f2,open() as f3:
		子代码

python中文件读写模式

1.“r” 只读模式(只读取不写入)

with open(r'a.txt', 'r', encoding='utf8') as f:
        print(f.read())
*如果文件路径不正确或不存在的话会直接报错
*如果文件路径正确,则直接读取该文件

2.“w” 只写模式(只写入不展示过程)

with open(r'b.txt', 'w', encoding='utf8') as f:
    pass
*如果文件路径不存在,会直接创建新文件
*如果文件路径存在,则会抹除文件中原有的数据,重新写入
*"pass"关键字只负责补全代码语法结构,不执行任何操作

3.“a” 只追加模式(之在文件末尾写入数据)

with open(r'a.txt', 'a', encoding='utf8') as f:
        f.write(数据值)
*只追加模式下,如果文件路径存在,则只会在文件末尾追加写入数据
*如果文件路径不存在的话,会直接创建一个新文件

python中的文件操作模式

1."t" 文本模式

*文本模式是python的默认操作模式,在以上三种读写模式中,完全的拼写应该是"rt","wt","at",但是在实际运用过程中我们可以省略"t"
*文本模式下只能操作文本文件
*文本模式下的读写都是以字符为单位的
*在使用文本模式时,需要encoding参数指定编码方式,如果为添加encoding参数,则以计算机默认的编码进行操作

2."b" 二进制模式(bytes模式)

*二进制模式不是python的默认操作方式,需要在读写模式的字母后添加“b”来指定(rb,wb,ab)
*可以操作任意类型的数据,将数据处理为二进制进行操作
*二进制模式下的读写都是以bytes(字节)为单位的
*不需要encoding参数指定编码,其本身采用二进制编码

文件诸多操作方法

graph LR A(文件操作方法)-->B(read相关) B-->1(read方法) B-->2(readline方法) B-->3(readlines方法) B-->4(readable方法) B-->5(for循环与read方法联用) A-->C(write相关) C-->a(write方法) C-->b(writeable方法) C-->c(writelines方法) A-->D(flush方法)
  • read相关
  1. read方法:
with open(r'a.txt', 'r', encoding='utf8') as f:
    f.read()
*read方法会一次性读取文件所有内容,读取结束后光标停在文件末尾
*当文件内容过多时一次性读取会造成内存溢出
*read后面的括号中可以填写数字,代表读取字符的个数
  1. readline方法
with open(r'a.txt', 'r', encoding='utf8') as f:
    f.readline()
*readline方法一次只读取一行内容
  1. readlines方法
with open(r'a.txt', 'r', encoding='utf8') as f:
    f.readlines()
*readlines方法会读取文件中所有数据,并按照分行将其组织成列表
  1. readable方法
with open(r'a.txt', 'r', encoding='utf8') as f:
    f.readable()
*readable用来判断文件是否处于可读取状态
  1. for循环与read方法联用
with open(r'a.txt', 'r', encoding='utf8') as f:
    for line in f:
    	print(line)
*for循环的使用也可以实现一行一行的读取文件内容

  • write相关
  1. write方法
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write()
*write方法后的括号内可以跟随需要写入的数据
  1. writeable方法
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.writeable()
*writeable方法用来判断文件是否是可写入文件
  1. writelines方法
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.writelines([1,2,3,4,5])
*writelines方法会接受一个列表,然后将列表中的数据值写入文件

  • flush方法
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.flush()
*flush方法的作用是将内存中的文件立刻存储到硬盘,与ctrl+s的作用相同

文件内光标的移动

  1. seek方法
with open(r'a.txt', 'rb') as f:
    print(f.read())
    f.seek(0,0)
语法构成:seek(偏移量,模式)
偏移量表示光标移动的字节数
模式分为三种:“0”,“1”,“2”
0:光标基于文件开头位置移动,在文本模式以及二进制模式都可以使用
1:光标基于光标当前所在位置移动,只可以在二进制模式下使用
2:光标基于文件末尾位置移动,只可以在二进制模式下使用
  1. tell方法
with open(r'a.txt', 'rb') as f:
    print(f.read())
    f.tell()
tell方法的作用是指出光标距离返回文件开头位置已经移动了多少距离

文件内光标移动案例(了解)

import time

with open(r'a.txt', 'rb') as f:
    f.seek(0, 2)  # 光标处于文件末尾
    while True:
        line = f.readline()  # 读取每一行数据,但是由于光标在文件末尾,所以无法读取
        if len(line) == 0:  # 无法读取的情况下值为0
            # 没有内容
            time.sleep(0.5)  # 每间隔0.5秒进行一次读取
        else:
            print(line.decode('utf8'), end='')  # 当文件内容改变后,输出读取到的新增数据

计算机修改数据的原理

计算机储存数据的方式类似于刻字,用磁头将数据刻写在磁盘上,而当我们需要修改数据内容时,并不能在硬盘已经刻写好的数据中间部分添加或者删除,计算机只能将原有的数据抹除,然后重新刻写

而在计算机中,我们所进行的删除操作,只是将数据的状态进行改变,计算机会将硬盘中我们所删除的数据打上空白标记,将原来这些数据占用的数据存储单元解放出来,“空白”的意思就是可用,新存进硬盘里的数据会直接写在这个位置,把这个文件的数据覆盖掉,也就是自始至终这个文件都没有消失,只是被当成了空白的空间,这就像是一幅画,画家觉得没有画好,他不会直接丢掉这张纸,而是等到下次画新画的时候,把旧画当成一张白纸,在上面画新的内容。

文件内容修改(了解)

修改文件内容的方式1:覆盖写
with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()  # 用变量名绑定读取到的数据
with open(r'a.txt', 'w', encoding='utf8') as f1:
    f1.write(data.replace('jason', 'tony'))  # 写入新的数据替换原有的数据

修改文件内容的方式2:换地方写
'''先在另外一个地方写入内容 然后将源文件删除 将新文件命名成源文件'''
import os

with open('a.txt', 'r', encoding='utf8') as read_f, 
        open('.a.txt.swap', 'w', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('tony', 'kevinSB'))


os.remove('a.txt')  # 删除a.txt
os.rename('.a.txt.swap', 'a.txt')  # 重命名文件
posted @ 2022-10-09 19:18  逐风若梦  阅读(443)  评论(0编辑  收藏  举报