内容替换首先想一下方式,替换后的内容存在哪里?
1、存源文件中 2、存新文件中
源文件好说,一定存在,新文件呢,不存在的话怎么去自动创建呢?最简单的就是open文件的时候选择“w”或者“a”一类的模式,这两类模式下会自动创建不存在的文件,如果是多级文件,则文件的父级目录必须存在否则会创建失败。
注:w模式会先清空文件,慎用。推荐使用“a”模式。文件open的时候指针初始化位置是在内容的最开始处。关于指针,对文件
的读写,指针代表的是读写的起始位置,并向后进行操作。
新建
os.mknod()函数差创建文件,
os.mkdir()函数创建一级目录,
import os
if not os.path.exists('foldername'):
os.mkdir('foldername')
os.makedirs()函数创建多级目录。
删除
os.remove()函数删除文件,
os.rmdir()函数删除一级目录,
import os
if os.path.exists('foldername'):
os.rmdir('foldername')
os.removedirs()函数删除多级目录。
方式一,内容存到原文件:
def txt_change(file_path, old_str, new_str):
with open(file_path, 'r+') as fp:
data = fp.read()
# 打印当前指针的位置
print '源文件的字节总数:', fp.tell()
# 用新字符串替换旧字符串
new_data = data.replace(old_str, new_str)
# 移动指针到文件最开始位置,写入新内容
fp.seek(0, 0)
fp.write(new_data)
# 打印当前指针的位置
print '新内容的字节总数:', fp.tell()
# 用于截断文件,如果没有指定 size,则从当前指针位置起后面的所有字符被删除。
fp.truncate()
注:此方法会清除旧内容,不利于数据恢复。
方式二,内容写到新文件:
def change_txt(old_file, new_file, old_str, new_str):
with open(old_file, 'a+') as fo:
# 用w模式,新文件将被清空以存放新内容
with open(new_file, 'w+') as fn:
data = fo.read()
# 用新字符串替换旧字符串
new_data = data.replace(old_str, new_str)
fn.write(new_data)
注:选择新文件保存内容,相当于多了一个原文件作为备份,推荐使用此方法。值得注意的是,用于替换的字符串字节总数(UTF-8编码中,一个英文字符占1个字节,一个中文字符占3个字节;GBK编码中,中英文都占两个字节)不得超过待替换的字符串,如果超过,就会覆盖部分原文件内容,这是由硬盘的读写机制决定的,所以,关于这一点我们在使用文件修改时,必须十分小心,及时备份,防止文件丢失。
上面两种方法上都是一次性读写整个文件,当文件太大时,对内存要求很高,如果我们换种思路,按行来操作会怎样?
def c_txt(old_file, new_file, old_str, new_str):
start = time()
with open(old_file, 'r+') as fo:
# 用w模式,新文件将被清空以存放新内容
with open(new_file, 'w+') as fn:
modify_times = 0 # 统计修改次数
data = fo.readline()
# print 'old_str:', data
while data:
if old_str in data:
modify_times += 1
# 用新字符串替换旧字符串
new_data = data.replace(old_str, new_str)
fn.write(new_data)
# print 'new_str:', new_data
data = fo.readline()
end = time()
print '文件修改的次数:', modify_times, '按行读写的总时间:', (end-start)
经过对比,发现还是一次性读写比较节约时间,实际效果等工作中总结再补充。