Removed
Removed

Reputation: 109

Import dictionary from txt file

I have a function CalcPearson that needs 2 dictionaries as input. The dictionaries are in txt files in the following format:

(22, 0.4271125909116274)
(14, 0.4212051728881959)
(3, 0.4144765342960289)
(26, 0.41114433561925906)
(39, 0.41043882384484764)
.....

How can I import the data from the files as dictionaries? Do I need to modify them or there is a simple function for this?

I tried with this code:

inf = open('Route_cc.txt','r')
inf2 = open('Route_h2.txt','r')
d1 = eval(inf.read())
d2 = eval(inf2.read())
print(calcPearson(d1,d2))
inf.close()

But I got an invalid syntax error at the second row of the first file that the code opened so I think I need a particular syntax in the file.

Upvotes: 0

Views: 2090

Answers (3)

The6thSense
The6thSense

Reputation: 8335

Don't use eval it is dangerous (see the dangers of eval). Instead, use ast.literal_eval.

You can't create a dictionary directly from an input as you have given it. You have to go through the lines, one by one, convert them into a zip object and add it to a dictionary.

This process is shown below.

Code:

import ast

inf = open('Route_cc.txt','r')
d1 = {}
for line in inf:
    zipi = ast.literal_eval(line)
    d1[zipi[0]] = zipi[1]

inf2 = open('Route_h2.txt','r')
d2 = {}
for line1 in inf2:
    zipi1 = ast.literal_eval(line1)
    d2[zipi1[0]] = zipi1[1]

print(calcPearson(d1, d2))
inf.close()
inf2.close()

Upvotes: 0

Zach Gates
Zach Gates

Reputation: 4130

If you're certain that you are looking for a dictionary, you can use something like this:

inf = open('Route_cc.txt', 'r')
content = inf.read().splitlines()
for line in range(content):
    content[line] = content[line].strip('(').strip(')')
    content[line] = content[line].split(', ')
inf_dict = dict(content)

Or more condensed:

inf = open('Route_cc.txt', 'r')
content = inf.read().splitlines()
inf_dict = dict(i.strip('(').strip(')').split(', ') for i in content)

Another option:

import re
inf = open('Route_cc.txt', 'r')
content = inf.read()
inf_dict = dict(i.split(', ') for i in re.findall("[^()\n-]+", content))

Note: Your original use of eval is unsafe and a poor practice.

Upvotes: 2

Garvit Jain
Garvit Jain

Reputation: 1

Since you've mentioned that your dictionaries are in txt files, you'll have to tokenize your input by splitting into key/value pairs.

  1. Read the file, line by line.
  2. Remove the leading and trailing braces.
  3. Split the stripped line using a comma as a delimiter.
  4. Add each line to your dictionary.

I've written this code, and tested it for the sample input you have given. Have a look.

import collections

def addToDictionary(dict, key, value):
    if key in dict:
        print("Key already exists")
    else:
        dict[key] = value

def displayDictionary(dict):
    dict = collections.OrderedDict(sorted(dict.items()))
    for k, v in dict.items():
        print(k, v)

filename = "dictionary1.txt"
f = open(filename, 'r')
dict1 = {}
for line in f:
    line = line.lstrip('(')
    line = line.rstrip(')\n')
    tokenizedLine = line.split(', ')
    addToDictionary(dict1, tokenizedLine[0], tokenizedLine[1])
displayDictionary(dict1)

Upvotes: 0

Related Questions