C++程序 从文件中删除给定行号
在文件处理的过程中,有时候需要删除某些行。如果删除某一行比较简单,则用文本编辑器就可以做到。但若需要删除多个指定行数的行时,手动删除会非常费时间。此时,我们需要一个程序来自动完成这个任务。
程序思路
我们需要定义一个函数,它能够接收一个文件名和一个包含行号的列表,然后删除文件中指定的行。
在实现这个函数之前,我们要先了解几个 Python 文件处理相关的概念:
- 文件操作模式:
在 Python 中使用内置的 open()
函数可以打开一个文件,它的语法如下:
file = open(file_name [, access_mode][, buffering])
其中,
file_name
:文件名字符串;access_mode
:文件打开模式,如 “r” 表示只读,”w” 表示写入,”a” 表示追加等;buffering
:指定缓存策略。如果buffering
为0,则以无缓冲的方式读写文件,则不能忽略缓冲区中的任何数据;如果buffering
大于1,则表示将缓冲这许多字节数。0或1表示使用系统默认的缓存机制。
- 文件对象:
open()
函数返回的就是文件对象。我们可以调用文件对象的方法来读写文件。如,read(x)
表示读取第 x 个字节的数据,readline()
表示读一行数据等。
- 读写指针:
文件读写指针标识了从文件何处开始读写。
当我们读写了一个文件时,文件读写指针会自动移动到下一个可读写位置。但是,调用 seek()
方法可以移动文件指针的位置。
在文件处理过程中,我们需要用到如下方法:
file.readline()
: 读取整行,包括 “\n” 字符。-
file.readlines()
: 读取所有行,返回一个列表。
接下来我们根据上述概念来实现我们的代码,如下:
代码实现
def removelines(filename, rows):
with open(filename, "r") as f:
lines = f.readlines()
with open(filename, "w") as f:
for i, line in enumerate(lines):
if i+1 not in rows:
f.write(line)
这个函数需要两个参数:
filename
:文件名;rows
:需要删除的行号列表。
函数内部首先打开文件并读取所有内容,然后逐行判断,如果当前行不在需要删除的行号列表中,则写入到新的文件中。当然,最后还需要将文件关闭。
测试
就以删除文件的第 2、3 行为例进行测试:
filename = "file.txt"
rows = [2,3]
removelines(filename,rows)
原始文件内容如下:
Line 1: This is a test file.
Line 2: This is second test line
Line 3: This is third test line
Line 4: This is fourth test line
Line 5: This is fifth test line
Line 6: This is sixth test line
运行后,文件内容变为:
Line 1: This is a test file.
Line 4: This is fourth test line
Line 5: This is fifth test line
Line 6: This is sixth test line
结论:
通过上述代码实现,我们成功编写一个 Python 程序,能够从文件中删除指定行号的内容。这个程序的核心就是从文件中逐行读取内容,并在需要删除指定的行时跳过写入,最终实现了精确删除指定行号的功能。这个程序在某些场景下非常实用,能够帮助我们更高效地处理文件。