标签:技术 set 自动 替换 move ima 位置 读取 两种方法
什么是文件?
操作系统给用户提供的可以操作硬盘的简易接口
Python的文件操作:
r: 读
1、只能读,不能写, f.readable() = True
2、如果文件不存在,会报错。
w: 写
1、不能进行读操作,只能写。
2、写的时候会覆盖之前的内容
3、如果指定文件不存在,会创建一个,不会报错。
a: 追加
1、不能进行读操作
2、指定文件不存在,不会报错,会创建一个文件。
3、光标默认在末尾。
文件操作单位
t: 文本模式
必须和r/w/a连用,比如 rt, wt, at, 如果不写,默认为t
b: 二进制模式
不能单独在mode里使用,必须和r/w/a连用。通常用来处理非文本文件
open 关键字
f = open(‘文件路径‘, mode=‘‘, encoding="")
Python2中读取文件默认使用的是ASCLL编码,python3读取文件默认使用UTF-8
python2读取文件打印时会报错
注意:如果文件操作是b模式的话就不能写encoding,不然会报错 :ValueError: binary mode doesn‘t take an encoding argument
单独用open操作文件时,需要关掉文件接口 f.close() 。因为如果不关的话,虽然变量f,Python会通过垃圾回收机制回收掉,但是对于操作系统,它会把这个文件操作的接口一直开着,导致浪费资源。
打开一个文件的时候,会占用两部分资源:操作系统级打开的文件 + 应用程序的变量。所以要注意,两个资源都要及时回收。
Python 提供了一个方法,能自动回收操作系统级打开的文件资源。那就是with关键字。
with open(‘文件路径‘, mode=‘‘) as f:
。。。
python3 操作文件只有一种方法 open()
python2 操作文件有两种方法 file() open()
file(), open()的操作都比较类似,但是两个有本质的区别,file是一个文件类,打开文件时相当于是在构造文件类。而open()是在用Python的一个内置函数来操作。
python2读取文件默认使用的是ascll,python3默认使用的是utf-8编码
文件操作相关方法:
f.read() 读取所有数据
f.readline() 读取一行数据, 光标移动到第二行行首
f.readlines() 返回一个列表,列表元素是每一行的内容
f.readable() 判断不否可读
f.write() 写入数据
当write针对 b模式写入时,需要把数据进行encode, 将内存的unicode编码内容 encode成二进制文件,才能写入。
f.writelines() 写入一个迭代器对象,比如列表。
当写入针对b模式时,需要把迭代器里面的元素进行encode,
f.writeable() 判断能不能写
f.truncake(size:int) 截断文件,保留 0-size长度的文件,其余的全部删掉。
truncake是截断文件,所以文件的打开方式必须是可写,w或者w+会清空文件,所以不能选择。因此truncake截断文件只能在 r+, a, a+模式下进行。
f.tell() 查看光标移动了多少位
f.seek(offset:int, whence=0)
offset: 光标移动的位数
whence 有三种选择 0, 1, 2
0:表示光标从头开始
1:表示光标从当前位置开始
2:表示光标从尾部开始
注意:1和2模式只能在b模式下使用,且只能以bytes移动文件。
思考:如何修改文件内的内容?
修改时,打开的文件必须可写,而w,w+之类的会清空文件,修改不了。a,a+模式,只能在尾部添加。也不行
使用r+的时候,再利用f.seek(),移动光标,新内容会覆盖旧内容。如果长度不一样,就会把要用的内容覆盖掉。
方案一:将文件的内容全部读取出来,利用replace替换掉要修改的内容。再将替换过的内容利用w/w+写入文件
with open(‘文件路径‘, ‘r’, encoding=‘utf-8‘):
data = f.read()
with open(‘文件路径‘, ‘w‘, encoding=‘utf-8‘) as f:
res = data.replace(old, new)
f.write(res)
缺点:当文件很大时,将内容一次性全read出来,有可能造成内存溢出。
优点:不占硬盘空间,硬盘始终只有一个文件。
方案二:将文件的内容逐行读取,再打开一个新文件,写入逐行读取并修改后的内容。最后把旧文件删了,保留并将新文件重命名为旧文件。
with open(‘文件路径‘, ‘r’, encoding=‘utf-8‘) as f, \
open(‘新文件路径‘,‘a‘, encoding=‘utf-8‘) as f2,
for line in f:
line_data = line.replace(old, new)
f2.write(line_data)
import os
os.remove(‘旧文件‘)
os.rename(‘新文件‘, ‘旧文件’)
优点:内存中始终只有一行内容,不占内存
缺点:在某一时刻,硬盘中会存在两个文件
标签:技术 set 自动 替换 move ima 位置 读取 两种方法
原文地址:https://www.cnblogs.com/KbMan/p/11152911.html