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

时间:2013-07-19 13:37:49

标签: python python-3.x

这是一个示例文本文件

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]

但这不起作用我该如何处理?

7 个答案:

答案 0 :(得分:5)

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

import fileinput

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

答案 1 :(得分: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

答案 2 :(得分:3)

我找到了另一个有效工作的解决方案,并且没有对文件对象中的行进行所有肮脏而不那么优雅的计算:

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),\ n转义符也将被复制到列表元素中:

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

当我希望用户决定在某个文本文件中删除哪一行时,这已经完成了我的工作。 我认为Martijn Pieters的答案确实如此。类似的,但他的解释对我来说很难说。

答案 3 :(得分:1)

假设num是要删除的行号:

import numpy as np
a=np.genfromtxt("yourfile.txt",dtype=None, delimiter="\n") 
with open('yourfile.txt','w') as f:    
    for el in np.delete(a,(num-1),axis=0):
        f.write(str(el)+'\n')

答案 4 :(得分:0)

你开始计算一个,但python索引总是从零开始。

处开始您的行计数:

for num, line in enumerate(myFile):  # default is to start at 0

或从num中减去一个,从lines(不是line)中删除:

del lines[num - 1]

请注意,为了使.readlines()调用返回任何行,您需要先重新打开文件,或者寻找开头:

myFile.seek(0)

答案 5 :(得分:0)

尝试

lines = myFile.readlines()  

mylines = [x for x in lines if x.find(phrase) < 0]  

答案 6 :(得分:0)

实现@atomh33ls numpy 方法 所以你想删除文件中包含 phrase 字符串的任何行,对吗?而不是仅仅删除 phrase 字符串

import numpy as np

phrase = 'the dog barked'

nums = [] 

with open("yourfile.txt") as myFile:
    for num1, line in enumerate(myFile, 0):
    # Changing from enumerate(myFile, 1) to enumerate(myFile, 0)
        if phrase in line:
            nums.append(num1)

a=np.genfromtxt("yourfile.txt",dtype=None, delimiter="\n", encoding=None ) 
      
with open('yourfile.txt','w') as f:
    for el in np.delete(a,nums,axis=0):
        f.write(str(el)+'\n')

文本文件在哪里,

the bird flew
the dog barked
the cat meowed

生产

the bird flew
the cat meowed