2013-07-10 3 views
1

У меня есть идентификатор в переменной invalid_change, который я пытаюсь удалить из входного файла «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() 

ответ

0

проблема заключается в том, что, когда вы достигнете этой линии:

346917 352470 

переменная ifvalid устанавливается в False и, таким образом, это конкретная строка (даже если она настроена) не записывается en в выходной файл.

Возможные решения:

  1. Изменить строку например. используя регулярные выражения. Они будут заменять.
  2. Не пропустите запись «недействительной» строки в файл, просто подготовьте ее без идентификатора, который вы хотите удалить (как в решении № 1).

Сообщите нам, если у вас есть какие-либо вопросы.

Другие проблемы в вашем коде:

  • подгузник антишаблоном (вы ловите все исключения, в том числе NameError, в то время как вы должны поймать только ValueError, а точнее выполнения теста, включая in ключевое слово) - это причина вы не видите ошибки, связанные с отсутствием invalid_change и invalid_gerrit переменных,
  • вместо открытия и закрытия f_write, вы можете использовать его также в with заявлении вы уже используете, если у вас есть Python 2.7+ или 3.1+,
  • str.split() расщепляется по умолчанию по непечатаемых и удаляет пустые строки из результата, поэтому вместо написания line.strip().split(' ') вы могли бы просто написать line.split(),
+0

можете ли вы предложить, какое регулярное выражение использовать? regex может быть излишним. – user2341103

+0

@ user2341103: Да, похоже, что это избыток, поэтому постарайтесь его избежать. Это было предложение, которое вы должны применить, если оно соответствует вашему проекту. – Tadeck

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) 
+0

@lib - что делать, если ввод - это список, если только отдельный номер. Я просто изменил вход в моей логике. – user2341103

+0

Затем используйте 'if gerrit not in invalid_list' вместо' if gerrit! = Invalid_list'. – llb

+0

Что такое fwrite здесь? Это выходной файл? – user2341103

Смежные вопросы