Как добавить таблицу в словарь из заданного текстового файла с помощью Python?

#python #python-3.x #python-2.7

#python #python-3.x #python-2.7

Вопрос:

Допустим, у нас есть два текстовых файла, каждый из которых содержит таблицу типа:

table1.txt

 a: 1
b: 2
c: 3
b: 4
 

table2.txt

 a: 1
b: 2
c: 3
b: 5
 

Я хотел бы добавить эти таблицы в словари Python, а затем сравнить записи, чтобы вывести несоответствующий результат в выходной файл. В приведенном выше примере

output.txt

 b:4 | b:5
 

Ценю ваш вклад!

Ответ №1:

Для каждого файла и для каждой из их строк добавьте их как записи в словаре. В конце сравните записи обоих словарей и запишите в файл те записи, которые не совпадают.

 def count_words(file, dict):
    for line in file:
        key_value = line.split(":")
        key = key_value[0]
        dict[key] = key_value[1].strip()


dict1 = {}
dict2 = {}
with open("table1.txt", "r") as file1:
    with open("table2.txt", "r") as file2:
        count_words(file2, dict2)
    count_words(file1, dict1)


with open("output.txt", "w") as f:
    for k in dict1:
        if dict1[k] != dict2[k]:
            f.write("{0}:{1} | {0}:{2}n".format(k, dict1[k], dict2[k]))
 

Ответ №2:

Прежде всего, сохраните пары ключ-значения из файлов, удалив пробелы и ‘ n’ (метод strip) в словаре:

 d = dict()
for path in file_paths:
    with open(path, 'r') as f:
      for line in f:
        key, value = line.strip().replace(' ', '').split(':')
        if key in d.keys():
          d[key].append(value)
        else:
          d[key] = [value]
 

Затем выведите значения, если для соответствующего ключа больше 1:

 for k,v in d.items():
    if len(set(v)) > 1:
      s = [k   ':'   vv for vv in set(v)]
      s = ' | '.join(s)
      print(s)
 

Ответ №3:

Прочитайте обе таблицы в словарях, выполните итерацию по ключам первой, чтобы найти ключи, которые существуют во второй, с разными значениями, и одновременно создайте вывод в виде списка:

  with open('table1.txt') as f:
    d1 = dict(line.strip().split(': ') for line in f)
    
with open('table2.txt') as f:
    d2 = dict(line.strip().split(': ') for line in f)
    
different = [f'{key}:{value} | {key}:{d2[key]}' 
                 for key, value in d1.items() 
                 if key in d2 and value!=d2[key]]

out = 'n'.join(different)
print(out)
# b:4 | b:5
 

Ответ №4:

Я бы сделал это следующим образом:

 t1, t2 = [], []

# below, we read data in from both files.
with open("table1.txt", "r") as f:
    t1 = f.read().split("n")
with open("table2.txt", "r") as f:
    t2 = f.read().split("n")

t12 = []
for i in t1:
    for j in t2:
        vals = i.split(":"), j.split(":") # we split up the key and value from each file.
        if vals[0][0] == vals[1][0]: # i.e. if the keys are the same
            t12.append(f"{vals[0][0]}: {vals[0][1]} | {vals[1][0]}: {vals[1][1]}n") # create a new string that combines both values.

# writing to the new file
with open("tables_combined.txt", "w") as f:
    for i in t12:
        f.write(i)
 

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

1. У меня появилась идея. Спасибо. Однако ваш код сбрасывает этот вывод: a: 1 b | a: 1 b

2. @sam я внес соответствующие изменения. Рад, что смог помочь.

Ответ №5:

Я бы, вероятно, прочитал каждый файл в свой собственный словарь. Итак, прочитайте файл, назначьте букву в качестве ключа и число в качестве значения, что означает, что вы получаете два dicts как таковые:

 dict1 = {
  "a": 1,
  "b": 2,
  "c": 3,
  "d": 4
}

dict2 = {
  "a": 1,
  "b": 2,
  "c": 3,
  "d": 5
}
 

Затем вы можете перебирать оба dicts, сравнивая ключи и сохраняя нечетные в список или что-то подобное. Вы могли бы сделать это, выполнив что-то вроде этого (если вы достаточно уверены, что оба словаря имеют те же буквы, что и ключи):

 mismatched_values = []
for key in dict1:
  if dict1[key] != dict2[key]:
    mismatched_values.append(str(key)   ":"   str(dict1[key])   "|"   str(key)   ":"   str(dict2[key])
 

Затем вы можете снова вывести mismatched_values параметр в текстовый файл.

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

1. Первая структура данных, которую вы использовали, — это dict ионарий, а не массив.

Ответ №6:

В вашем случае вам нужно прочитать все в словарях python, а затем сравнить их и распечатать выходные данные в output.txt файл

 with open("a.txt", "r") as first_file:
    with open("b.txt", "r") as second_file:
        first_dict = {}
        second_dict = {}
        for i in first_file.readlines():
            first_dict[i.split(':')[0]] = i.split(':')[1].replace("n", "").replace(" ", "")
        for i in second_file.readlines():
            second_dict[i.split(':')[0]] = i.split(':')[1].replace("n", "").replace(" ", "")
with open("report.txt", "w ") as out_file:
    for i in first_dict.keys():
        if first_dict[i] != second_dict[i]:
            out_file.write("{a}:{b}|{a}:{c}n".format(a=i, b=first_dict[i], c=second_dict[i]))