根据用户输入在文件中找到特定行,然后删除特定数量的行

时间:2016-06-24 15:44:15

标签: python

我正在尝试删除文本文件中的特定行,我需要通过提示用户输入字符串(文件中应该存在的短语)来搜索文件,如果是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

4 个答案:

答案 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行更近,那么它将会出现问题。我将把它作为读者的练习。