two dictionaries from text file where values are columns and key line counts

Viewed 37

My file has this pattern (this is an example). I want to create two dictionaries with each column as values, and key as integers.

John  Moor
Age   22
id    112
grade 60

Amy  Ling
Age  22
id   114
grade 67

The dictionaries should look like this:

dict1 = {1 : ["John", "Age", "id", "grade"], 2 : ["Amy", "Age", "id", "grade"]}
dict2 = {1 : ["Moor", 22, 112, 60], 2 : ["Ling", 22, 114, 67]}

I did some digging but most solution given is - first column as key and second column as value. This much I could think of, tried to split column by readlines().split()[0] but did not work.

f = open(fname)
d = {}
for line in f:
    name, info = line.split() 
    d[name] = info
print(d)

Any suggestion? Any Help? how should I do it? :)

1 Answers

You can use defaultdict to store data and strip and split** function to manipulate the line that you read.

file.txt

John  Moor
Age   22
id    112
grade 60

Amy  Ling
Age  22
id   114
grade 67

Here is the Code:

from collections import defaultdict

dict1 = defaultdict(list)
dict2 = defaultdict(list)

with open("file.txt") as file:
    idx = 1
    for line in file.readlines():
        stripped_line = line.strip()
        if stripped_line:
            items = stripped_line.split(" ")
            dict1[idx].append(items[0])
            try:
                dict2[idx].append(int(items[-1]))
            except:
                dict2[idx].append(items[-1])
        else:
            idx += 1

print(f"dict1: {dict(dict1)}")
print(f"dict2: {dict(dict2)}")

Output:

dict1: {1: ['John', 'Age', 'id', 'grade'], 2: ['Amy', 'Age', 'id', 'grade']}
dict2: {1: ['Moor', 22, 112, 60], 2: ['Ling', 22, 114, 67]}

Update

It would be more meaningful if you could store data like:

from collections import defaultdict

dict1 = defaultdict(list)

with open("file.txt") as file:
    is_first_line = True
    key = None
    for line in file.readlines():
        stripped_line = line.strip()
        if stripped_line:
            items = stripped_line.split(" ")

            if is_first_line:
                key = items[0] + ' ' + items[-1]
            else:
                try:
                    dict1[key].append({items[0]: int(items[-1])})
                except:
                    dict1[key].append({items[0]: items[-1]})
            is_first_line = False
        else:
            is_first_line = True

print(f"dict1: {dict(dict1)}")

output:

dict1: {'John Moor': [{'Age': 22}, {'id': 112}, {'grade': 60}], 'Amy Ling': [{'Age': 22}, {'id': 114}, {'grade': 67}]}
Related