如何使用python中的行号从文本文件中删除行

2024-09-28 20:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个示例文本文件

the bird flew
the dog barked
the cat meowed

这是我要删除的短语的行号

phrase = 'the dog barked'

with open(filename) as myFile:
    for num, line in enumerate(myFile, 1):
        if phrase in line:
            print 'found at line:', num

我可以添加什么来删除行号(num) 我试过了

lines = myFile.readlines()
del line[num]

但这不管用我该怎么做?


Tags: thein示例linemyfilenumcat文本文件
3条回答

一个名为gnibbler的用户在另一个线程上发布了类似的内容。

在适当的位置修改文件,违规行将替换为空格,这样文件的其余部分就不需要在磁盘上乱放。如果修复不长于要替换的行,也可以将行“修复”到位

如果可以更改另一个程序以输出文件偏移量而不是行号,则可以直接将偏移量分配给p,而不必使用for循环

import os
from mmap import mmap

phrase = 'the dog barked'
filename = r'C:\Path\text.txt'

def removeLine(filename, num):
    f=os.open(filename, os.O_RDWR)
    m=mmap(f,0)
    p=0
    for i in range(num-1):
        p=m.find('\n',p)+1
    q=m.find('\n',p)
    m[p:q] = ' '*(q-p)
    os.close(f)

with open(filename) as myFile:
    for num, line in enumerate(myFile, 1):
        if phrase in line:            
            removeLine(filename, num)
            print 'Removed at line:', num

我找到了另一个有效的解决方案,它不需要对文件对象中的行进行令人讨厌的、不那么优雅的计数:

del_line = 3    #line to be deleted: no. 3 (first line is no. 1)

with open("textfile.txt","r") as textobj:
    list = list(textobj)    #puts all lines in a list

del list[del_line - 1]    #delete regarding element

    #rewrite the textfile from list contents/elements:
with open("textfile.txt","w") as textobj:
    for n in list:
        textobj.write(n)

对想要的人的详细解释:

(1)创建包含要删除的行号整数值的变量。假设我要删除第3行:

del_line = 3

(2)打开文本文件并将其放入文件对象中。现在只需要阅读模式。然后,将其内容放入列表中:

with open("textfile.txt","r") as textobj:
    list = list(textobj)

(3)现在每一行都应该是“list”中的索引元素。可以通过删除表示要删除的行的元素来继续:

del list[del_line - 1]

在这一点上,如果您得到了应该从用户输入中删除的行号,请确保首先将其转换为整数,因为它很可能是字符串格式(如果您使用“input()”)。

这是del_line-1,因为列表的元素索引从0开始。但是,我假设您(或用户)开始在第1行的“1”处计数,在这种情况下,您需要扣除1以获取列表中的正确元素。

(4)再次打开列表文件,这次以“写入模式”,重写完整的文件。之后,遍历更新的列表,将“list”的每个元素重写到文件中。您不必担心新行,因为在将原始文件的内容放入列表时(步骤2),转义符也将复制到列表元素中:

with open("textfile.txt","w") as textobj:
    for n in list:
        textobj.write(n)

当我想让用户决定删除某个文本文件中的哪一行时,这就完成了我的工作。 我认为马蒂金·皮特斯的回答也有相似之处,不过他的解释对我来说是微不足道的。

您可以使用fileinput模块更新文件-注意,这将删除所有包含短语的行:

import fileinput

for line in fileinput.input(filename, inplace=True):
    if phrase in line:
        continue
    print(line, end='')

相关问题 更多 >