删除我的文件中包含python中某个变量的行

时间:2018-01-05 01:30:25

标签: python arrays sorting startswith

我的test.txt看起来像

bear
goat
cat

我想要做的是拿它的第一行,这是熊和查找和包含它的行然后删除它们,这里的问题是当我运行我的代码它所做的一切都是删除我的所有内容输出文件。

import linecache
must_delete = linecache.getline('Test.txt', 1)
with open('output.txt','r+') as f:
    data = ''.join([i for i in f if not i.lower().startswith(must_delete)])
    f.seek(0)                                                         
    f.write(data)                                                     
    f.truncate()  

2 个答案:

答案 0 :(得分:0)

  1. 您阅读了变量must_delete,但是使用mustdelete解析。
  2. 您浏览输出文件(i代表f中的i);我想你想要扫描输入。
  3. 您在给定位置截断文件;你确定你想要做什么里面循环?

答案 1 :(得分:0)

你想要的就是就地编辑,意思是一行一行地同时读写。 Python有fileinput模块,它提供了这种能力。

from __future__ import print_function
import linecache
import fileinput

must_delete = linecache.getline('Test.txt', 1)

for line in fileinput.input('output.txt', inplace=True):
    if line != must_delete:
        print(line, end='')

注释

  • fileinput.input()的调用包含指定就地编辑的参数inplace=True
  • 在with块中,由于就地编辑,print()功能(通过魔术)将打印到文件,而不是您的控制台。
  • 我们需要使用print()调用end=''以避免额外的行结束字符。或者,我们可以省略from __future__ ...行并使用这样的print语句(注意结束逗号):

    print line,
    

更新

如果你想检测第一行的存在(例如'熊')那么还有两件事要做:

  1. 在之前的代码中,我没有从must_delete中删除新行,因此它可能看起来像bear\n。现在我们需要剥离新行,以便在行内的任何地方进行测试
  2. 我们必须进行部分字符串比较,而不是将该行与must_delete进行比较:if must_delete in line:
  3. 全部放在一起:

    from __future__ import print_function
    import linecache
    import fileinput
    
    must_delete = linecache.getline('Test.txt', 1)
    must_delete = must_delete.strip()  # Additional Task 1
    
    for line in fileinput.input('output.txt', inplace=True):
        if must_delete not in line:  # Additional Task 2
            print(line, end='')
    

    更新2

    from __future__ import print_function
    import linecache
    import fileinput
    
    must_delete = linecache.getline('Test.txt', 1)
    must_delete = must_delete.strip()
    total_count = 0  # Total number of must_delete found in the file
    
    for line in fileinput.input('output.txt', inplace=True):
        # How many times must_delete appears in this line
        count = line.count(must_delete)
        if count > 0:
            print(line, end='')
        total_count += count  # Update the running total
    
    # total_count is now the times must_delete appears in the file
    # It is not the number of deleted lines because a line might contains
    # must_delete more than once