我有一个函数CalcPearson
需要2个词典作为输入。字典采用以下格式的txt文件:
(22, 0.4271125909116274)
(14, 0.4212051728881959)
(3, 0.4144765342960289)
(26, 0.41114433561925906)
(39, 0.41043882384484764)
.....
如何将文件中的数据作为词典导入?我需要修改它们还是有一个简单的功能呢?
我尝试使用此代码:
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()
但是我在代码打开的第一个文件的第二行遇到了无效的语法错误,所以我想我需要在文件中使用特定的语法。
答案 0 :(得分:2)
如果您某些您正在寻找dictionary,则可以使用以下内容:
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)
或更浓缩:
inf = open('Route_cc.txt', 'r')
content = inf.read().splitlines()
inf_dict = dict(i.strip('(').strip(')').split(', ') for i in content)
另一种选择:
import re
inf = open('Route_cc.txt', 'r')
content = inf.read()
inf_dict = dict(i.split(', ') for i in re.findall("[^()\n-]+", content))
注意:您对eval
的原始使用不安全且做法不佳。
答案 1 :(得分:0)
不要使用eval
这是危险的(请参阅the dangers of eval
)。相反,请使用ast.literal_eval
。
您无法直接从输入中创建字典。您必须逐行浏览,将它们转换为zip
对象并将其添加到字典中。
此过程如下所示。
代码:
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()
答案 2 :(得分:0)
由于您已经提到您的词典位于txt
个文件中,因此您必须通过分割为键/值对来对您的输入进行标记。
我已经编写了这段代码,并根据您提供的示例输入对其进行了测试。看看。
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)