5

这是一个示例文本文件

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]

但这不起作用我应该如何解决这个问题?

4

7 回答 7

8

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

import fileinput

for line in fileinput.input(filename, inplace=True):
    if phrase in line:
        continue
    print(line, end='')
于 2013-07-19T14:06:01.913 回答
3

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

在原地修改文件,违规行被替换为空格,因此文件的其余部分不需要在磁盘上随机播放。如果修复不长于您要替换的线,您也可以将线“修复”到位

如果其他程序可以改成输出fileoffset而不是行号,可以直接把offset赋值给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
于 2013-07-19T14:06:32.483 回答
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) 现在每一行都应该是“列表”中的索引元素。您可以继续删除代表您要删除的行的元素:

del list[del_line - 1]

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

它是 del_line - 1,因为列表的元素索引从 0 开始。但是,我假设您(或用户)从“1”开始计数行号。1,在这种情况下,您需要减去 1 才能捕获列表中的正确元素。

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

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

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

于 2016-01-08T15:49:23.547 回答
2

假设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')
于 2013-07-19T15:13:37.150 回答
0

您从1开始计数,但 python 索引始终从零开始。

从零开始行数:

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

或从 中减一,从(not )num中删除:linesline

del lines[num - 1]

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

myFile.seek(0)
于 2013-07-19T13:39:36.050 回答
0

尝试

lines = myFile.readlines()  

mylines = [x for x in lines if x.find(phrase) < 0]  
于 2013-07-19T14:10:28.690 回答
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
于 2021-04-07T06:35:09.560 回答