Сравните 2 списка в файле и сохраните результат в другом файле

#python #list #csv

Вопрос:

У меня есть 2 списка, записанных в файлы (File1.txt и File2.txt) и мне нужно сравнить строку за строкой и записать количество одинаковых случаев в Output.txt файл.

Однако результат, записанный в вывод, неверен. Смотрите ниже код, который я использовал, и полученный результат, и желаемый:

 input_file1 = open('C:\Temp\File1.txt', 'r')
input_file2 = open('C:\Temp\File2.txt', 'r')
output_file = open('C:\Temp\Output.txt','w')

match = 0
strOutput = ""

for line1 in input_file1:
    LST1 = list(line1)
    input_file2.seek(0)
    output_file.write('n')
    for line2 in input_file2:
        LST2 = list(line2)
        match = len(set(LST1).intersection(set(LST2)))
        strOutput = str(match)   ','    line2
        output_file.write("%s" %(strOutput))
                        
output_file.close()
input_file2.close()
input_file1.close()

 

input_file1:
01,04,07,23,39
03,05,08,37,45
02,03,10,13,28

input_file2:
01,02,03,21,22,23,27
03,05,10,13,37,39,47

вывод (НЕВЕРНЫЙ!):
7,01,02,03,21,22,23,27
7,03,05,10,13,37,39,47
5,01,02,03,21,22,23,27
6,03,05,10,13,37,39,47
5,01,02,03,21,22,23,27
4,03,05,10,13,37,39,47

вывод (ПРАВИЛЬНЫЙ):
2,01,02,03,21,22,23,27
1,03,05,10,13,37,39,47
1,01,02,03,21,22,23,27
3,03,05,10,13,37,39,47
2,01,02,03,21,22,23,27
3,03,05,10,13,37,39,47

или:

вывод (ПРАВИЛЬНЫЙ):
2,1,2,3,21,22,23,27
1,3,5,10,13,37,39,47
1,1,2,3,21,22,23,27
3,3,5,10,13,37,39,47
2,1,2,3,21,22,23,27
3,3,5,10,13,37,39,47

Комментарии:

1. Вы пытаетесь разделить элементы на список, как в [01 , 02 , 03, …]? Потому что в вашем текущем коде кажется, что он генерирует список, как в: [ ‘0’ , ‘1’ , ‘,’ , ‘0’ , ….] В этом может быть проблема.

2. @заид-аль-шаттл — Действительно, это одна из проблем. Но если вы используете 1,2,3 (каверты для целых чисел),… во входных файлах (File1.txt и File2.txt) это также не дает желаемого результата.

3. дайте мне несколько минут, и я смогу попытаться устранить неполадки для вас.

4. @J. Сильва Вам нужно проанализировать входные строки, например, так: LST1 = line1.strip().split(',') или LST1 = list(map(int, line1.strip().split(','))) .

5. @ekhumoro — Поздравляю. Спасибо за код. Мне также понравилось решение заида аль-Шаттла. И то и другое сработало.

Ответ №1:

Вот фиксированный код:

 input_file1 = open('File1.txt', 'r')
input_file2 = open('File2.txt', 'r')
output_file = open('Output.txt','w')

match = 0
strOutput = ""

for line1 in input_file1:
    LST1 = line1.strip().split(',')
    input_file2.seek(0)
    output_file.write('n')
    for line2 in input_file2:
        LST2 = line2.strip().split(',')
        match = len(set(LST1).intersection(set(LST2)))
        strOutput = str(match)   ','    line2
        output_file.write("%s" %(strOutput))
                        
output_file.close()
input_file2.close()
input_file1.close()
 

Есть два основных вопроса:

1 — Исходная строка: LST1 = list(line1) не создавал правильный список, заканчивающийся списком: ['0' , '1' , ',' , '0' , ....] вместо ['01','02',...]

2 — В вашем исходном документе у вас есть новый символ строки в конце каждой строки, поэтому ваша строка 1 выглядит так: '01,04,07,23,39n' чтобы решить эту проблему, мы удаляем последние 2 символа.

С обоими этими изменениями вы получите эту строку:

 LST1 = line1.strip().split(',')
 

Где .strip() удаляет символ новой строки и .split(',') правильно разбивает его.

Запуск этого кода дал мне этот вывод:

 2,01,02,03,21,22,23,27
1,03,05,10,13,37,39,47
1,01,02,03,21,22,23,27
3,03,05,10,13,37,39,47
2,01,02,03,21,22,23,27
3,03,05,10,13,37,39,47
 

Комментарии:

1. Ваше первое решение подвержено ошибкам, поскольку оно предполагает, что каждая строка должна заканчиваться новой строкой. Он более надежен в использовании strip() для удаления любых завершающих пробелов.

2. Я это заметил, отсюда и моя правка. Вы предлагаете удалить первый вариант целиком и заменить его отредактированным ответом? @эхуморо?

3. @заид-аль-шаттл — Поздравляю. Спасибо за объяснение. Мне также понравилось решение эхуморо. И то и другое сработало.

4. @ZaidAlShattle Я так думаю, потому что это может дать неверный вывод. (Кроме того, на самом деле это удаление одного символа, а не двух).

5. Отметил, отредактирую его сейчас. Я допустил ошибку при написании двух символов (так как /n считается одним символом). Спасибо вам за ваши отзывы!