文件的高级应用及修改的两种方式

文件的高级应用及修改的两种方式

一、文件的高级应用

1.1 r+(既可读又可写)

with open('test.py', 'r+', encoding='utf8') as fr:
    data = fr.read()
    print(fr.writable())
    fr.write('x = 10')
    print(data)
------------------------------------------------
True
'''
sean sb
tank sb
jason sb
nick 大帅比
'''

1.2 w+(不建议使用)

with open('test.py', 'w+', encoding='utf8') as fr:
    print(fr.readable())
    fr.write('x = 10')
    data =  fr.read()
    print(data)
----------------------------------------
True    

1.2 a+(a的指针在末尾。更不建议使用)

with open('test.py', 'a+', encoding='utf8') as fr:
    fr.seek(1, 0)   #表示指针从头开始,偏移一位
    data = fr.read()  # 指针在末尾
    print(data)
-----------------------------------------------------
 = 10

二、文件的内置方法

2.1 seek 指针(按字节位移动)

with open('test.py', 'rb') as fr:
    fr.seek(1)  # 1表示位移1位,默认从文件头开始
    fr.seek(1, 0)  # 1表示偏移1位,0表示从头开始  
    fr.seek(2, 1)  # 2表示偏移2位,1表示从当前位置开始  
    fr.seek(0, 2)  # 0表示偏移0位,2表示文件末开始,把指针移到文件末

2.2 tell(告诉当前指针的位置) (按字节移动)

with open('test.py', 'r', encoding='utf8') as fr:
    fr.seek(2, 0)   #从文件头开始,偏移2位
    print(fr.tell())     
-----------------------------------------------------
2

2.3 read(n) (读几个字符)

with open('test.py', 'r', encoding='utf8') as fr:
    print(fr.read(2))  # 读了2个字符也就是读了6个字节

2.4 truncate 截断 (按字节移动)

with open('test.py', 'a', encoding='utf8') as fr:
	fr.truncate(2)  # 把2个字节后面的东西全清空 
	#一个英文是1个字节,一个中文是3个字节
	

三、文件修改的两种方式

3.1 方式一

import os
with open('test.py', 'r', encoding='utf8') as fr, 
        open('test_swap.py', 'w', encoding='utf8') as fw:
    data = fr.read()   #全部读入内存,如果文件很大会很卡
    data = data.replace('sb', 'ss')  #在内存中完成修改
    fw.write(data)   # 新文件一次性写入原文件内容
os.remove('test.py')  # 删除文件
os.rename('test_swap.py', 'test.py')  # 重命名文件

3.2 方式二

import os
with open('test.py', 'r', encoding='utf8') as fr, 
        open('test_swap.py', 'w', encoding='utf8') as fw:
    for i in fr   #对fr文件里面的内容进行一个循环,逐行修改
    i = i.replace('sb', 'ss')  #在内存中完成修改
    fw.write(i)   # 新文件写入原文件修改后内容
os.remove('test.py')  # 删除文件
os.rename('test_swap.py', 'test.py')  # 重命名文件

原文地址:https://www.cnblogs.com/yanjiayi098-001/p/11321503.html