这是一个示例文本文件
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]
但这不起作用我该如何处理?
答案 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