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

原文地址:https://www.cnblogs.com/schut/p/8410961.html

时间: 2024-08-29 06:12:04

Python文件修改和常用方法的相关文章

python文件修改 核心5步

文件修改 核心5步1.以读的模式打开原文件,产生句柄f12.以写的模式打开另一个原文件,产生句柄f23.读取原文件的内容并将原文件需要替换的内容修改写入到新文件4.删除原文件5.把新文件重名了成原文件 import os # 1.以读的模式打开原文件,产生句柄f1 # 2.以写的模式打开另一个原文件,产生句柄f2 with open('1.txt', encoding='utf-8', mode='r') as f1, open('2.txt', encoding='utf-8', mode='

python脚本修改hosts文件

记一次使用python脚本来修改hosts文件,由于公司服务器需要换ip地址,服务器里都是Linux系统,而hosts文件中有些解析的ip,手动一台一台的解析太麻烦,就写了这个脚本.本来以为感觉很简单,但是写的过程真不好写,也试过shell脚本,不过也不好写.然后就直接用python写,也找了一些网上的教程,不过也没有很好的解决问题.下面把脚本贴出来记录下 #!/usr/bin/python #coding:utf8 import os import sys import re hostsfil

一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 @for&ever 2010-07-03 功能: 获取指定目录下面符合一定规则的文件名称和文件修改时间,并保存到指定的文件中 脚本如下: #!/usr/bin/env python# -*- coding: utf-8 -*- '''Created on 2010-7-2 @author: fore

python文件夹遍历,文件操作,获取文件修改创建时间

在Python中,文件操作主要来自os模块,主要方法如下: os.listdir(dirname):列出dirname下的目录和文件os.getcwd():获得当前工作目录os.curdir:返回当前目录('.')os.chdir(dirname):改变工作目录到dirname os.path.isdir(name):判断name是不是一个目录,name不是目录就返回falseos.path.isfile(name):判断name是不是一个文件,不存在name也返回falseos.path.ex

Python—文件

1 def fileCopy(src, dst, srcEncoding, dstEncoding): 2 with open(src, 'r', encoding=srcEncoding) as srcfp: 3 with open(dst, 'w', encoding=dstEncoding) as dstfp: 4 dstfp.write(srcfp.read()) 5 fileCopy('sample.txt', 'sample_new.txt', 'cp936', 'utf8') 一.

Python批量修改一个目录文件名

#!/usr/bin/env python # -*- coding:utf-8 -*- import re  import os import time # str.split(string) 分割字符串 # '连接符'.join(list) 将列表组成字符串 def change_name(path): global i if not os.path.isdir(path) and not os.path.isfile(path): return False if os.path.isfil

成功解决在Python文件上右键菜单无“Edit with IDLE”选项

我电脑是Win7旗舰版,之前电脑上安装的是Python2.6版本的,前两天为了体验一下Microsoft Excel与Python之间互操作, 下载并安装了DataNitro,在安装的时候脑残的安装了Python2.7.5,但是这两天在用的时候,发现之前安装的一些包后不能用了: print sys.path 才知道,Python的搜索路径变成了Python2.7.5的路径了,傻眼了,怎么办? 于是,一通百度,google之后,折腾了一个上午,终于搞定了: 首先,我在cmd里面是可以正常使用Pyt

【文件修改】_练习

文件1: 文件2: 要求:把文件1里第一行内容"11111111111"改成"888888888"然后把整个文件的内容写到文件2里去,最后把文件2的名字改成文件1的名字: 1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 # Author:zhaosj 4 import os # 导入系统模块 5 6 # 文件修改 7 8 f1 = open("lianxiti01",'r',encoding='utf

python文件的增删改查操作

1 def choice(): 2 print(''' 3 1 查找 4 2 删除 5 3 添加 6 4 修改 7 ''') 8 def forlist(): 9 with open("test2", encoding="utf8", mode="r+") as w: 10 for line in w: 11 print(line.strip()) 12 13 14 def check(): 15 usr=input("输入你要查找的域