我正在尝试删除文本文件中的特定行,我需要通过提示用户输入字符串(文件中应该存在的短语)来搜索文件,如果是string是否存在该行上的数据和数字行号。
找到短语后,打印出以下五行。现在我必须弄清楚如何删除这六行而不更改文件中的任何其他文本,这是我的问题大声笑。
关于如何删除这六行的任何想法?
这是我最近删除这些行的尝试
file = open('C:\\test\\example.txt', 'a')
locate = "example string"
for i, line in enumerate(file):
if locate in line:
line[i] = line.strip()
i = i+1
line[i] = line.strip()
i = i+1
line[i] = line.strip()
i = i+1
line[i] = line.strip()
i = i + 1
line[i] = line.strip()
i = i+1
line[i] = line.strip()
break
答案 0 :(得分:1)
通常我不认为覆盖源文件是可取的 - 如果用户误做了什么怎么办?如果您的项目允许,我会将更改写入新文件。
with open('source.txt', 'r') as ifile:
with open('output.txt', 'w') as ofile:
locate = "example string"
skip_next = 0
for line in ifile:
if locate in line:
skip_next = 6
print(line.rstrip('\n'))
elif skip_next > 0:
print(line.rstrip('\n'))
skip_next -= 1
else:
ofile.write(line)
这对于多次查找短语也很有用 - 它只会开始计算要删除的行。
答案 1 :(得分:0)
您将open
与'a'一同追加到您的文件中。此外,你没有关闭你的文件(坏习惯)。 str.strip()
不删除该行,默认情况下会删除空格。此外,这通常会在循环中完成。
这是开始:
locate = "example string"
n=0
with open('example.txt', 'r+') as f:
for i,line in enumerate(f):
if locate in line:
n = 6
if n:
print( line, end='' )
n-=1
print( "done" )
编辑:
读 - 修改 - 写解决方案:
locate = "example string"
filename='example.txt'
removelines=5
with open(filename) as f:
lines = f.readlines()
with open(filename, 'w') as f:
n=0
for line in lines:
if locate in line:
n = removelines+1
if n:
n-=1
else:
f.write(line)
答案 2 :(得分:0)
您可以找到事件,将事件之间的列表项复制到新列表,然后将新列表保存到文件中。
_newData = []
_linesToSkip = 3
with open('data.txt', 'r') as _file:
data = _file.read().splitlines()
occurrences = [i for i, x in enumerate(data) if "example string" in x]
_lastOcurrence = 0
for ocurrence in occurrences:
_newData.extend(data[_lastOcurrence : ocurrence])
_lastOcurrence = ocurrence + _linesToSkip
_newData.extend(data[_lastOcurrence:])
# Save new data into the file
答案 3 :(得分:0)
有几点你在这里明显误解了:
.strip()
删除空格或给定字符:>>> print(str.strip.__doc__)
S.strip([chars]) -> str
Return a copy of the string S with leading and trailing
whitespace removed.
If chars is given and not None, remove characters in chars instead.
i
实际上没有做任何事情:>>> for i, _ in enumerate('ignore me'):
... print(i)
... i += 10
...
0
1
2
3
4
5
6
7
8
i
元素,这应该引发异常 (你忽略了告诉我们) >>> line = 'some text'
>>> line[i] = line.strip()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
如果要更改其内容,则必须写到文件。写入您正在阅读的文件是一件棘手的事情。写入替代文件,或者只是将文件存储在内存中是一种更健康的方法。
search_string = 'example'
lines = []
with open('/tmp/fnord.txt', 'r+') as f: #`r+` so we can read *and* write to the file
for line in f:
line = line.strip()
if search_string in line:
print(line)
for _ in range(5):
print(next(f).strip())
else:
lines.append(line)
f.seek(0) # back to the beginning!
f.truncate() # goodbye, original lines
for line in lines:
print(line, file=f) # python2 requires `from __future__ import print_function`
但是,这种方法存在一个致命的缺陷 - 如果追求的线比距离末端的第6行更近,那么它将会出现问题。我将把它作为读者的练习。