从txt文件导入字典

时间:2015-08-06 06:45:37

标签: python dictionary

我有一个函数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()

但是我在代码打开的第一个文件的第二行遇到了无效的语法错误,所以我想我需要在文件中使用特定的语法。

3 个答案:

答案 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个文件中,因此您必须通过分割为键/值对来对您的输入进行标记。

  1. 逐行阅读文件。
  2. 删除前导和尾随大括号。
  3. 使用逗号作为分隔符拆分剥离的行。
  4. 将每一行添加到词典中。
  5. 我已经编写了这段代码,并根据您提供的示例输入对其进行了测试。看看。

    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)