从生成的文本文件中删除更多ID

时间:2013-07-10 02:30:16

标签: python

我在invalid_change变量中有一个id,我试图从输入文件“list.txt”中删除它,并创建一个文件results.txt,如下所示。任何人都可以提供有关如何修复的输入?我有一个样本输入和预期输出低于..

'''
INPUT(list.txt:-

350882 348521 350166
346917 352470
360049


EXPECTEDOUTPUT(results.txt):-
350882 348521 350166
346917
360049
'''
invalid_list=['352470','12345']

f_write = open('results.txt', 'wb')

with open('list.txt','r') as f :
    for line in f :
        #delete the whole line if any invalid gerrit is presnet
        gerrit_list = line.strip().split(' ')

        ifvalid = True
        for gerrit in gerrit_list:
            try:  # check if invalid gerrit is present
                invalid_gerrit.index(invalid_change)
                ifvalid = False
                break
            except:
                pass

        if ifvalid:
            f_write.write(line)

f_write.close()

2 个答案:

答案 0 :(得分:0)

问题是当你到达这一行时:

346917 352470

ifvalid变量设置为False,因此不会将此特定行(即使已调整)写入输出文件。

可能的解决方案:

  1. 修改字符串,例如。使用正则表达式。他们会替换。
  2. 不要跳过向文件写“无效”行,只需准备好没有要删除的ID(如解决方案1中所示)。
  3. 如果您有任何疑问,请告诉我们。

    代码中的其他问题包括:

    • 尿布反模式(您可以捕获所有例外情况,包括NameError,而您应该只捕获ValueError,或者更确切地说执行包含in关键字的测试) - 这就是您的原因没有看到与缺少invalid_changeinvalid_gerrit变量相关的错误,
    • 而不是打开和关闭f_write,您也可以在已经使用的with语句中使用它,如果你有Python 2.7+或3.1 +,
    • str.split()默认按空格拆分,并从结果中删除空字符串,因此您只需编写line.strip().split(' '),而不是写line.split()

答案 1 :(得分:0)

gerrit_list中的每个项目都是一个单独的数字。您无需查找数字中是否包含无效更改。事实上,这可能会导致错误。您可以直接遍历gerrit_list中的项目并丢弃与invalid_list匹配的项目:

for line in f:
    gerrit_list = line.split()
    valid_gerrits = [gerrit for gerrit in gerrit_list if gerrit not in invalid_list]
    if valid_gerrits:
        newline = ' '.join(valid_gerrits) + '\n'           
        f_write.write(newline)