У меня есть тестовый выходной 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)
Каждая строка в вашем 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 "}?
Ой, извините за это, подумал, что вы получите список значений при чтении csv, а не строки. Я добавлю код
Я получаю: KeyError: 'T' из строки 9
попробуйте скопировать код еще раз, возможно, вы пропустили редактирование, с моей стороны все в порядке, если все еще не работает, опубликуйте свой csv
Вы были правы, я что-то пропустил. Но у вас есть новая ошибка :) Кажется, выдает ошибку, если во втором файле появляется новый тест, которого еще нет в первом файле
этого и следовало ожидать, поскольку код ищет ключ в fileOne_dict, которого не существует. мы можем сначала проверить наличие ключа с помощью dict.get (key), который возвращает None, если ничего не находит.
Думаю, мы почти у цели. С использованием; с open ('diff.csv', 'w') как outFile: outFile.write (json.dumps (fileOne_dict)) я получаю непрерывную строку, а не исходный макет, например; test1 Pass Failed test 2 Pass test 3 FailedToBuild и т. д.
поэтому dict to csv не кажется очень простым, вероятно, было бы лучше использовать списки вместо словарей, но что бы то ни было, он сделал так, чтобы он выводил список списков, а затем мог легко записывать его в csv, теперь все равно работает на моем конце
Спасибо за это. Формат теперь правильный, но он неправильно определяет, где изменился статус. В некоторых случаях (например, когда во втором файле есть новый тест) рядом с именем теста нет статуса. В других это добавление неверного статуса?
Хорошо ... Я не вижу твоих ошибок. вы должны опубликовать, как воспроизвести ошибку, если хотите, чтобы кто-то еще помог исправить ее.
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
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
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