【Python】对文本文件操作小结(二):删改文本文件

前言:在我之前的博客“对文本文件操作小结(一)”中,我已经对python中对文本文件操作进行了基本的阐述,我们已经明白了二进制文件和文本文件的区别,如何建立文件和程序的连接和怎样对文件进行读写操作。但是很多时候我们还需要删改文本文件中的内容,接下来我将介绍删改文件的操作。

一:如何删改文本文件中的内容
(1)清空文本文件内容:如果想删除文本文件的全部内容,我们可以选择打开文件方式为‘w’并不写入内容直接关闭文件,这样文本文件中的内容就会被清空。这种方法很简单,这里不做展示。
(2)删除指定行文本文件内容:但是很多时候我们并不需要完全删除文本文件的内容,我们需要删除比如某一行的内容。之前的内容中并没有删除文本文件中数据的方法,但是我们可以通过将除了欲删除数据段意外的文本文件内容写入内存,再写入原文本文件,这样就可以达到删除指定文本文件的效果。例如,我将英文诗《When you are old》的部分内容写入了文本文件中:在这里插入图片描述
如果我想要删除文本文件的前两行,我的代码可以是:

infile = open('When you are old.txt','r')
transit = "" #创立空的字符串用于储存文件
line_number = 1  #记录文本文件的行号
for line in infile: #使用迭代器读取每一段文本文件的内容
    if (line_number==1) or (line_number==2):
        line_number += 1
        continue
    else:
        transit += line #将数据写入过渡的字符串中
        line_number += 1
infile.close()
onfile = open('When you are old.txt','w') #以清空原文本文件内容的方式打开文件写入
onfile.write(transit)
onfile.close()

经过这样的操作之后,我们再打开原来的文本文件,发现原来的文件已经变为在这里插入图片描述
除了这里我使用的我们也可以使用通过内容查询来删除我们想要删除的内容,例如我想删除我的范例中的作者姓名,我的代码可以改为:

for line in infile: #使用迭代器读取每一段文本文件的内容
    if 'by william butler yeats' in line:
        continue
    else:
        transit += line #将数据写入过渡的字符串中

但是如果文本文件中存在重复语句的情况,那么很可能会出现误删的情况。实际上当你对一个文本文件进行操作时,你必须了解你将要操作的文本文件的存储格式。从而才能选择正确的方式对文本文件进行操作。
(3)修改文本文件指定内容
其实我们修改内容和删除的思想基本上差别不大,修改不就是将更改过后的内容存入中转内存中吗?比如我想将我的范例中作者姓名的首字母大写,我的代码可以是:

infile = open('When you are old.txt','r')
transit = "" #创立空的字符串用于储存文件
for line in infile: #使用迭代器读取每一段文本文件的内容
    if 'william butler yeats' in line: #判断作者姓名是否在此行数据中
        words = line.rstrip('\n').split(' ') #去掉一行数据末尾的换行符,以空格为分割点分割字符串返回一个列表
        for word in words:
            if word == 'by':
                transit += word+' '
            else:
                transit += word.capitalize()+' ' #capitalize()返回首字母大写的字符串
        transit += '\n' #在此行末尾加上去掉的换行符
    else:
        transit += line #将数据写入过渡的字符串中
infile.close()
onfile = open('When you are old.txt','w') #以清空原文本文件内容的方式打开文件写入
onfile.write(transit)
onfile.close()

这样运行以后,原文本文件变为
在这里插入图片描述

二:同时定义多个文件对象
在刚刚的范例中,可能有朋友在想,如果同时在读取文件的时候也定义一个以‘w’模式打开的文件对象,能不能免去定义过渡字符串这个步骤达到目的呢?我们不妨试一试,还是跟上面一样删除文件前两行,代码为:

infile = open('When you are old.txt','r')
onfile = open('When you are old.txt','w')
line_number = 1  #记录文本文件的行号
for line in infile: #使用迭代器读取每一段文本文件的内容
    if (line_number==1) or (line_number==2):
        line_number += 1
        continue
    else:
        onfile.write(line) #将内容写入原文件
        line_number += 1
infile.close()
onfile.close()

运行以后的结果会是什么呢?我们在文本编辑器中打开文件来查看,会发现结果是:在这里插入图片描述
这是因为我们在用了两种不同的打开模式打开了文本文件,而‘w’模式打开的文件会自动清空原文本文件内容,所以会出现这种情况。
但是首先,我们并不是不能在一个文件对象尚未关闭之前定义另一个文件对象,只是不能以‘r’和‘w’这样矛盾的方式打开。
其次,这个解决问题的思想其实是不完全错的,我们可以在原文件的目录下创立一个新的文件,然后将原本的文件删去,将新文件的名字改成原来文本文件的名字,这样也能达到删改文件的目的。但是首先我们需要介绍两个方法,首先是os.rename()方法,os.rename() 方法用于命名文件或目录,格式为
os.name(a,b),a为要修改的文件,b为修改后的文件,如果b是一个存在的文件 将抛出OSError;
os.remove()删除指定路径文件
那么现在,我们将利用这些方法来实现我们的删除前两行的目的:

import os
infile = open('When you are old.txt','r')
onfile = open('new_file.txt','w') # 创立新文件new_file
line_number = 1  #记录文本文件的行号
for line in infile: #使用迭代器读取每一段文本文件的内容
    if (line_number==1) or (line_number==2):
        line_number += 1
        continue
    else:
        onfile.write(line) #将内容写入新文件
        line_number += 1
infile.close()
onfile.close()
os.rename('When you are old.txt','temp.txt') #将原文本文件名字改为temp
os.rename('new_file.txt','When you are old.txt') #将新文件名字改成原文件名字
os.remove('temp.txt') #删除原文件

所获得的结果是:
在这里插入图片描述

发布了7 篇原创文章 · 获赞 7 · 访问量 942

猜你喜欢

转载自blog.csdn.net/qq_46018836/article/details/105392049