从结果文本中删除更多ID

2024-04-26 22:44:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从输入文件“list.txt”中删除一个无效的\u change变量中的id,并创建一个文件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()

Tags: 文件intxtforifislineopen
2条回答

geru列表中的每一项都是一个单独的数字。您不需要查找无效更改是否包含在数字中。事实上,这可能会导致错误。您只需直接遍历gerrit\u list中的项,然后丢弃与无效\u 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)

问题是当你到达这条线时:

346917 352470

ifvalid变量被设置为False,因此这个特定的行(即使调整)不会被写入输出文件

可能的解决方案:

  1. 修改字符串,例如使用正则表达式。他们会做的
  2. 不要跳过向文件中写入“无效”行,只需在没有要删除的ID的情况下准备它(如解决方案1)

如果您有任何问题,请告诉我们

代码中的其他问题包括:

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

相关问题 更多 >