【问题标题】:Python: from a text file to dictionary with keysPython:从文本文件到带键的字典
【发布时间】:2013-12-27 10:09:02
【问题描述】:

我有一个包含八个名称的文本文件,按名称排序,如下所示:

Anna
David
Dennis
Morgan
Lana
Peter
Joanna
Karen

现在我想将它们放入字典并为每个名称添加不同的键。 名称在新行上。我想在字典中添加的名称是 000-111 的不同二进制数。 我该怎么做?

我试过这样的东西:

with open ('tennis.txt', 'r') as f:
    for line in f:

dict={}
for line in open('file.txt'):
        bin[0]=next(f)
        bin[1]=next(f)
        bin[2]=next(f)
        bin[3]=next(f)
        bin[4]=next(f)
        bin[5]=next(f)
        bin[6]=next(f)
        bin[7]=next(f)

【问题讨论】:

  • 名字是换行还是一行?
  • “添加不同的键”是什么意思?
  • 你能举个例子吗?问题不清楚。
  • 我现在添加了更多信息。

标签: python python-3.x dictionary key text-files


【解决方案1】:

根据andybuckley's 的回答,您可以这样完成:

d = {}
f = open("tennis.txt")
for i, l in enumerate(f):
    # cut the '0b' chars, so you will get your dict keys just like you want
    bin_num = bin(i)[2:]
    # if the key is shorter than 3 chars, add 0 to the beginning
    while len(bin_num) < 3:
        bin_num = '0' + bin_num
    d[bin_num] = l[:-1]

f.close()
for i in sorted(d.items()):
    print i

EDIT:感谢@pepr - 记得关闭打开的文件。

输出:

('000', 'Anna')
('001', 'David')
('010', 'Dennis')
('011', 'Morgan')
('100', 'Lana')
('101', 'Peter')
('110', 'Joanna')
('111', 'Karen')

【讨论】:

  • 我得到一个 TypeError,一个整数是必需的。在此之前我在文件名后添加了 'r' 和 'utf8',这是不正确的吗?
  • 您不必这样做。只需将我发布的代码作为 python 文件保存在与您的tennis.txt 文件相同的文件夹中并运行它。你在哪一行得到这个错误?
  • 它这样说 Traceback(最近一次调用最后一次):文件“/Users/josefinilic/Documents/tennistest2.py”,第 2 行,在 for i, l in enumerate(open( “tennis.txt”)):文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/encodings/ascii.py”,第26行,在解码返回codecs.ascii_decode(输入,自我。 errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 28: ordinal not in range(128)
  • 我认为这个帖子应该对你有帮助:stackoverflow.com/questions/11909905/…
  • 您忘记关闭文件了。
【解决方案2】:

知道你想要什么有点困难:我将这个问题解释为想要从文本文件中读取名称,并将每个名称插入到具有递增二进制键的字典中。这是一个交互式 Python3 会话,它执行此操作并显示填充的字典:

>>> d = {}
>>> for i, l in enumerate(open("tennis.txt")):
...     d[bin(i)] = l[:-1]
>>> d
{'0b10': 'Dennis', '0b11': 'Morgan', '0b110': 'Joanna', '0b0': 'Anna', '0b1': 'David', '0b101': 'Peter', '0b100': 'Lana', '0b111': 'Karen'}

请注意,我使用“d”而不是“dict”作为字典变量的名称,因为我不希望变量名隐藏类名:避免使用相同的名称总是一个好主意变量和类的名称,尽管 Python 不会反对。

【讨论】:

    【解决方案3】:

    使用 dict 推导、zfill 和枚举:

    with open('/tmp/names.txt') as f:
        print({bin(k)[2:].zfill(3): v.strip() for k,v in enumerate(f)})
    

    打印:

    {'000': 'Anna', '001': 'David', '011': 'Morgan', '010': 'Dennis', '101': 'Peter', '100': 'Lana', '110': 'Joanna', '111': 'Karen'}
    

    如果您不知道文件中有多少行以便为zfill 使用正确的数字,您可以先数一下:

    with open(fn) as f:
        i=max(ln for ln,line in enumerate(f) if line.strip())
        print(i, bin(i)[2:])
        fill=len(bin(i)[2:])
        f.seek(0)
        print({bin(k)[2:].zfill(fill): v.strip() for k,v in enumerate(f) if v.strip()})
    

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2012-03-08
      • 2015-09-27
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多