Объединение и удаление дубликатов в двух CSV без использования pandas

У меня есть тестовый выходной csv, который выглядит следующим образом:

test1   test success
test2   test failed
regtest failed to build

столбец 1 содержит уникальные строки, а столбец 2 содержит одну из следующих трех строк; тест успешен, тест не пройден, не удалось построить.

Я часто запускаю этот тест для новых сборок и хочу сравнить csv из последнего теста с предыдущим. Я хотел бы создать новый csv, содержащий все тесты, состояние которых (столбец 2) изменилось. Желательно в формате;

TestName OldState NewState

Вот моя текущая попытка, в которой показаны все различия между двумя файлами, но она выглядит так:

test1   test success
test2   test failed
regtest failed to build
test2   test success

Мне нужен способ объединить второй test2 с первым, чтобы он выглядел так:

test1   test success
test2   test failed      test success
regtest failed to build

Мой текущий код;

import csv
import sys

with open(sys.argv[1], 'r') as t1, open(sys.argv[2], 'r') as t2, open(sys.argv[2], 'r') as t3, open(sys.argv[1], 'r') as t4:
    fileOne = t1.readlines()
    fileTwo = t2.readlines()
    fileThree = t3.readlines()
    fileFour = t4.readlines()

with open(sys.argv[3], 'w') as outFile:
    for line in fileTwo:
        if line not in fileOne:
            outFile.write("From File 2," + line)

    for line in fileFour:
        if line not in fileThree:
            outFile.write("\r\nFrom File 1," + line)
редактировать я использую Python 3.3
J.C. 13.09.2018 17:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

with open(sys.argv[1], 'r') as t1, open(sys.argv[2], 'r') as t2:
    # Convert lines of Csv to list
    reader1 = list(csv.reader(t1))
    reader2 = list(csv.reader(t2))

# Create a dictionary of key value pairs for t1
fileOne_dict = {col[0]: [col[1]] for col in reader1}

# compare values based on keys and append if different
for col in reader2:
    if fileOne_dict.get(col[0]):
        if fileOne_dict[col[0]][0] != col[1]:
            fileOne_dict[col[0]].append(col[1])
    else:
        fileOne_dict[col[0]] = ["", col[1]]

out = [[key]+value for key, value in fileOne_dict.items()]
print(out)

with open ('diff.csv', 'w') as outFile:
    writer = csv.writer(outFile)
    writer.writerows(out)

Это должно оставить у вас словарь, содержащий нужную вам информацию.

Когда я использую этот код, я получаю строку {"T": "e R R R e e e e e e e e ...," P ":" B "}?

J.C. 13.09.2018 17:42

Ой, извините за это, подумал, что вы получите список значений при чтении csv, а не строки. Я добавлю код

Jerome Paddick 13.09.2018 17:58

Я получаю: KeyError: 'T' из строки 9

J.C. 13.09.2018 18:07

попробуйте скопировать код еще раз, возможно, вы пропустили редактирование, с моей стороны все в порядке, если все еще не работает, опубликуйте свой csv

Jerome Paddick 13.09.2018 18:11

Вы были правы, я что-то пропустил. Но у вас есть новая ошибка :) Кажется, выдает ошибку, если во втором файле появляется новый тест, которого еще нет в первом файле

J.C. 13.09.2018 18:20

этого и следовало ожидать, поскольку код ищет ключ в fileOne_dict, которого не существует. мы можем сначала проверить наличие ключа с помощью dict.get (key), который возвращает None, если ничего не находит.

Jerome Paddick 13.09.2018 18:29

Думаю, мы почти у цели. С использованием; с open ('diff.csv', 'w') как outFile: outFile.write (json.dumps (fileOne_dict)) я получаю непрерывную строку, а не исходный макет, например; test1 Pass Failed test 2 Pass test 3 FailedToBuild и т. д.

J.C. 13.09.2018 18:40

поэтому dict to csv не кажется очень простым, вероятно, было бы лучше использовать списки вместо словарей, но что бы то ни было, он сделал так, чтобы он выводил список списков, а затем мог легко записывать его в csv, теперь все равно работает на моем конце

Jerome Paddick 13.09.2018 23:00

Спасибо за это. Формат теперь правильный, но он неправильно определяет, где изменился статус. В некоторых случаях (например, когда во втором файле есть новый тест) рядом с именем теста нет статуса. В других это добавление неверного статуса?

J.C. 14.09.2018 10:17

Хорошо ... Я не вижу твоих ошибок. вы должны опубликовать, как воспроизвести ошибку, если хотите, чтобы кто-то еще помог исправить ее.

Jerome Paddick 14.09.2018 15:46
File 1: Test_ALG_1,Test success Test_ALG_2,Test failed Test_ALG_3,Failed to build exe Test_ALG_4,Test success Test_ALG_5,Test success
J.C. 17.09.2018 11:08
File 2: Test_ALG_1,Test failed Test_ALG_2,Test failed Test_ALG_3,Failed to build exe Test_ALG_4,Test success Test_ALG_6,Test success
J.C. 17.09.2018 11:09
Output: Test_ALG_1,Test failed Test_ALG_2,Test failed, Test failed Test_ALG_3,Failed to build exe Test_ALG_4,Test success Test_ALG_5, ,Test success Это примеры 2 входных файлов и 1 выходного файла @Mr_Nitrogen
J.C. 17.09.2018 11:10

Другие вопросы по теме