Python文件修改和常用方法
为了更好地说明接下来的文件修改操作,我们有必要先来学习下文件操作的常用方法。
一、文件处理中的常用方法
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
# write by congcong # flush() 把文件从内存强制刷新到硬盘
f = open('w_flush.txt',mode='r+')
f.write("这是强制刷新到硬盘的文件!")
f.flush()
print("查看文件:",f.read())
# f.close() # readable() 判断是否可读
print(f.readable()) #输出:True
f1 = open("w_flush.txt",mode='w') #文件的写操作
f1.write('判断文件是否可读!')
f1.flush()
print(f1.readable()) # 输出:False (表明写操作时文件也是不可读的) # readline() 输出一行,碰到\r 或者 \n结束
f = open('w_flush.txt',mode='a',encoding='gbk')
f.write('我是第一行!')
f.write('\n我是第二行!')
f = open('w_flush.txt',mode='r',encoding='gbk')
print(f.readline())#输出:我是第一行! # tell() 返回光标当前位置,以字节为计算单位
print(f.tell()) #输出 ; 14,因为编码为 gbk ,gbk每个中文字符占两个字节,所以此时光标位于第一行末尾 # seek() 将光标移到指定字节位置,以字节为计数单位
print(f.seek(2)) #输出:2
print(f.readline()) # 输出;是第一行!
print(f.seek(4)) #输出:4
print(f.readline()) #输出:第一行 # seekable() 判断文件能否seek,linux中使用(一切皆文件) # read() 括号内指定长度时,就从当前位置开始读几个字符;括号内没有指定长度时,就读全部文件,以字符为单位
print(f.tell())
print(f.seek(0))
print(f.read(2)) #输出:我是 # truncate() 按指定长度截断文件,括号内指定长度时,就从文件开头开始截断指定长度;不指定长度时,从当前位置到尾部的内容全部去掉
#此方法必须是在写模式下使用
f = open('w_flush.txt','r+',encoding='gbk')
print(f.seek(4)) #输出;4
print(f.tell()) # 输出;4
print(f.truncate(8)) #输出;8
print(f.seek(0)) #输出 :0 f.close()
了解了以上的方法,我们就能愉快地进行文件修改操作了。
二、文件修改操作
当我们以读写(r+)模式打开文件时,,默认会把新增的内容追加到文件最末尾。
这是为什么呢?那我们如果想要修改中间的内容该怎么办呢?
还记得我们刚学过一个tell()方法吗,它的单位是字节,当我们读一段内容的时候,光标会跟着移动,文件读完了,光标就会移到末尾,
再接着写,光标自然会跟着移动,写完后,光标就停留在末尾了,我们可以用tell()方法验证一下猜想,打印此时光标位置,
此时,我们再想读文件内容,就没有任何输出了,都是空白的。这就解释了为何我追加的内容为何无法读出来。
至于为何追加内容会从末尾开始,就容易理解了,当你以追加模式打开文件时,光标会默认移到文件尾部,再开始写。
而文件修改就要用到另一个方法了,seek()方法,它的作用就是移动光标到指定位置,移动的单位是字节,当我们想修改某个地方,
使用seek()方法将光标移到指定位置就可以再修改了,下面我们可以试一下:
# write.txt的原本内容是 :这是第一个我用Python写的文件!
# 现在我要将‘写’改为‘修改后’ f = open(file='write.txt',mode='r+',encoding='gbk')
print('修改前:\n',f.read(),f.tell()) # 读出修改前的文件内容,并打印当前光标位置
f.seek(20) # 将光标移到第20个字节后的位置(GBK编码一个汉字占2字节,英文占1字节)
f.write('修改后') # 写入修改内容
f.seek(0) # 将光标移到文件开头
print(f.tell()) # 打印当前光标位置
print('修改后:\n',f.read(),f.tell()) # 读出修改后的文件内容,并打印当前光标位置 f.close() # 关闭文件 '''
这是第一个我用Python写的文件! 29
0
修改后:
这是第一个我用Python修改后件! 29
'''
没有报错,正常执行,‘写’ 也的确被改成了 ‘修改后’ ,文件大小也并未改变,但是也有我们不想修改的内容被覆盖了,这就尴尬了。。。
原因在这里:
这是硬盘的存储原理导致的,当你把文件存到硬盘上,就在硬盘上划了一块空间,存数据,等你下次打开这个文件 ,seek到一个位置,每改一个字,就是把原来的覆盖掉,如果要插入,是不可能的,因为后面的数据在硬盘上不会整体向后移。所以就出现 当前这个情况 ,你想插入,却变成了会把旧内容覆盖掉。
解决方法呢?
想修改当然可以,但是不要在硬盘上修改,把内容全部读到内存里,数据在内存里可以随便增删改查,修改之后,把内容再全部写回硬盘,把原来的数据全部覆盖掉。
例如:
# -*- coding:utf-8 -*- import os # 导入模块 f1 = 'notebook.txt' # 待修改的文件
f2 = 'note_new.txt' # 修改后的文件
f_old = open(f1,mode='r',encoding='utf-8') # 打开待修改的文件
f_new = open(f2,mode='w',encoding='utf-8') # 写入修改的文件 old_str = '一' # 待修改的字符串
new_str = 'one' # 修改后的字符串
count = 0 # 统计修改次数
for line in f_old: # 循环读
if old_str in line:
newline = line.replace('一','one') # 替换
count += 1 # 每修改一次自增1
else:
newline = line
f_new.write(newline) # 写入修改后的文件
f_old.close() # 依次关闭
f_new.close()
os.replace('note_new.txt','notebook.txt') # 用新文件里的内容替换旧文件
print('修改次数:'count) # 修改次数:5
Python文件修改和常用方法的更多相关文章
- Python 文件修改-函数介绍
上节课复习:1.字符编码 1.1 如何解决乱码问题: 字符存取使用的编码标准不一致 1.2 文件头 在文件的首行写入文件头,用于控制Python解释器读取py文件内容时使用的编码 #coding:文件 ...
- python文件修改 核心5步,函数实现修改任意文件内容
文件修改 核心5步1.以读的模式打开原文件,产生句柄f12.以写的模式打开一个新文件,产生句柄f23.读取原文件的内容并将原文件需要替换的内容修改写入到新文件4.删除原文件5.把新文件重名了成原文件 ...
- Python 文件修改
# 需求: 把好人换成sb # 必须: # 1. 先从文件中读取内容 # 2. 把要修改的内容进行修改 # 3. 把修改好的内容写人一个新文件 # 4. 删除掉原来的文件 # 5. 把新文件重命名成原 ...
- 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本
摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 ...
- python批量进行文件修改操作
python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...
- python文件操作-修改文件中的内容
一.文件读写有缓冲区 fw = open('nhy','w') fw.write('sdfsdf') fw.flush()# 把缓冲区里面的数据立即写到磁盘上 fw.close() 二.with的用法 ...
- python文件夹遍历,文件操作,获取文件修改创建时间
在Python中,文件操作主要来自os模块,主要方法如下: os.listdir(dirname):列出dirname下的目录和文件os.getcwd():获得当前工作目录os.curdir:返回当前 ...
- Python批量修改Excel中的文件内容
import osimport xlrdfrom xlutils.copy import copydef base_dir(filename=None): return os.path.join ...
- python文件读写及修改
转载:https://www.cnblogs.com/zhxwind/p/8761618.html 文件的读写有三种形式:读.写和追加. 一.读模式 r 和读写模式 r+ 1.读模式 r 读模式r特点 ...
随机推荐
- PostgreSQL 日常SQL记录
平时用的比较多的SQL语句,有时候会忘掉一点点,在这里记录一下: 1.创建表的同时,插入数据: create table test as select generate_series(1, 10000 ...
- CFile与CArchive区别
一,区别 CFile是直接与磁盘打交道的一个文件对象,可以处理文本和二进制文件 CArchive将CFile作为自己的一个参数,通过该参数可以实现文本,二进制甚至继承至COject对象的类的本地存储和 ...
- 随想录(skyeye中的soc仿真)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 想学好soc,再怎么看芯片手册和linux kernel都不为过.但是要学习好kernel,那再 ...
- 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)
线程: 有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.是一串指令的集合.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是 ...
- I.MX6 U-Boot ping网络
/********************************************************************* * I.MX6 U-Boot ping网络 * 说明: * ...
- Python之xpath
xpath是一种在XML文档中定位元素的语言,常用于xml.html文件解析,比css选择器使用方便XML文件最小构成单元: - element(元素节点) - attribute(属性节点) - t ...
- UltraEdit工具安装和注册机破解
1.关闭网络连接(或者直接拔掉网线). 2.打开UltraEdit软件,稍等片刻会出现提示你你使用的是试用版本的窗口.如下图,点击“注册”. 3.填写许可证id和密码.许可证id可任意填写,不过根据经 ...
- 《DSP using MATLAB》示例Example7.21
代码: h = [1, 2, 3, 4, 3, 2, 1]/15; M = length(h); n = 0:M-1; [Hr, w, a, L] = Hr_Type1(h); a L amax = ...
- win10 svn server安装过程中到starting service时失败
当安装到Start Service阶段后,将会出错并会弹出一个对话框,提示是否要retry. (此时SVN服务软件已经安装完毕,仅仅是无法通过证书验证,无法启动服务),如果此时选择对话框中的cance ...
- YY一下十年后的自己(转)
每到年底总是我最焦虑的时候,年龄越大情况越明显.可能越长大越是对 时光的流逝 更有感触,有感触之后就会胡思乱想.所以随手开始写下这篇文章. 人无远虑必有近忧.那么同学呀,你听说过安利么. 一直都有做总 ...