删除列表中以word/string开头的所有行

qlckcl4x  于 2021-09-13  发布在  Java
关注(0)|答案(3)|浏览(268)

我正试图解析一个巨大的50k行文件,在这个文件中,我必须删除预定义列表中以单词present开头的任何行。
目前我已经尝试了下面的方法,但输出文件(db2unew)没有按预期工作-

rem = ['remove', 'remove1', 'remove2'....., 'removen']

inputFile = open(r"C:\file", "r")
outputFile = open(r"C:\file_12", "w")
lines = inputFile.readlines()
inputFile.close()
for line in lines:
    for i in rem:
        if line.startswith(i):
            outputFile.write('\n')
        else:
            outputFile.write(line)

我得到的文件与我最初放入的输出相同。。。脚本没有删除以列表中任何字符串开头的行。
你能帮助理解如何实现这一点吗?

fwzugrvs

fwzugrvs1#

当前,您将检查行是否以删除列表中的一个单词开头,每次检查一个单词。例如:
如果该行以“rem df…”开头,并且在循环中检查该行是否以“remove”开头,则if语句返回false并将该行写入输出文件。
您可以尝试以下方法:

remove = ['remove', 'rem-ove', 'rem', 'rem ove' ...... 'n']
inputFile = open(r"C:\DB12", "r")
outputFile = open(r"C:\DB12_NEW", "w")
for line in inputFile.splitlines():
    if not any(line.startswith(i) for i in remove):
        outputFile.write(line)

这个 any 仅关键字返回 False 如果所有元素都是 False .

xxhby3vn

xxhby3vn2#

使用 tuple 而不是 list 对于 str.startswith .


# rem = ['remove', 'rem-ove', 'rem ove']

rem = ('remove', 'rem-ove', 'rem ove')

with open('DB12', 'r') as inputFile, open('DB12_NEW', 'w') as outputFile:
    for line in inputFile.readlines():
        if not line.startswith(rem):
            outputFile.writelines(line)
4jb9z9bj

4jb9z9bj3#

有时这可能是由前导/尾随空格引起的。
尝试使用 strip() 检查一下。

rem = [x.strip() for x in rem]
lines = [line.strip() for  line in lines]

相关问题