2013-08-22 4 views
2

Итак, я создаю список в своем коде, и теперь я хочу проверить его на наличие существующего документа, чтобы узнать, какие отличия есть перед созданием нового документа.Сравнение списка с текстовым документом

Вот моя попытка:

diff = "" 
    if File2_Loc : 
     File2 = open(File2_Loc , 'r') 
     for line in R_List : 
      if line in File2 : 
       pass 
      else : 
       diff += (line.strip() + " not found in old file.\n") 
     for line in File2 : 
      if line == "***** Differences founds : *****\n" : 
       print("Compared!") 
       break 
      if line in R_List : 
       pass 
      else : 
       diff += (line.strip() + " not found in new file.\n") 
    else : 
     print("No file inputted:") 
    for line in R_List : 
     File1.write(line) 
    File1.write("***** Differences founds : *****\n") 
    if diff : 
     File1.write(diff) 
    else : 
     File1.write("None.\n") 

Проблема здесь, каждая строка в R_List не найден в Файл2, даже если 100% из них должны быть.

Я искал решение уже, но я не видел ничего, что касалось моей проблемы или работало на мою проблему.

ответ

2

Это потому, что файл читается только один раз. Если вы назовете «in» на нем, он не повторится снова (он «читается» из текущей позиции, которая является концом файла). Таким образом, решение будет читать весь файл в память, используя File2.readlines() и попытаться «в» на эту вещь :-)

File2 = open(File2_Loc , 'r') 
    lines2 = File2.readlines() # Define the lines here 
    File2.close()    # This is also a good idea 
    for line in R_List : 
     if line in lines2 :  # Iterate over lines instead of file 
      pass 
     else : 
      diff += (line.strip() + " not found in old file.\n") 
    for line in lines2 :  # Iterate over lines instead of file 
     if line == "***** Differences founds : *****\n" : 
      print("Compared!") 
      break 
     if line in R_List : 
      pass 
     else : 
      diff += (line.strip() + " not found in new file.\n") 

Решение 2: Это решение использует наборы и оператор «-» делая дизъюнкции на них:

File2 = open(File2_Loc , 'r') 
    lines2 = File2.readlines() # Define the lines here 
    File2.close()    # This is also a good idea 
    not_in_file2 = list(set(R_list) - set(lines2)) 
    not_in_rlist = list(set(lines2) - set(R_list)) 
    # Finish the diff output accordingly. 
+0

Второй Зонда кажется лучше, однако, я не хочу lines2 включить что-нибудь после того, как ***** Differences Найдено: ***** \ п текст, который будет на конец любых старых файлов. Я думал об итерации через список2, чтобы найти, где это происходит, и отрубить его там. – CamelopardalisRex

+0

Какой бы вы ни хотели :-) Я сделал только эскиз второго решения, так как проблема вращалась вокруг итерации по файлу не вокруг того, что вы делаете с этим позже. Я надеюсь, что итерация будет работать для вас. –