#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 считается одним символом). Спасибо вам за ваши отзывы!