Python 3.x Python3:文件中表内容的字典字典

Python 3.x Python3:文件中表内容的字典字典,python-3.x,file-io,dictionary,Python 3.x,File Io,Dictionary,手头的任务是,我必须将文件的表内容放入字典结构的字典中。 该文件包含如下内容:(ascii文件的前六行) 名称----------Alt Name----------RA----DEC---z---CR---FX---FX*.\124; Error---LX---NH | ID-\124; Ref#---- RXCJ0000.1+0816 UGC12890 0.0295 8.2744 0.0396 0.26 5.80 5.39 12.4 0.37 5.9 1,3 RXCJ0001.9+1204

手头的任务是,我必须将文件的表内容放入字典结构的字典中。 该文件包含如下内容:(ascii文件的前六行)

名称----------Alt Name----------RA----DEC---z---CR---FX---FX*.\124; Error---LX---NH | ID-\124; Ref#---- RXCJ0000.1+0816 UGC12890 0.0295 8.2744 0.0396 0.26 5.80 5.39 12.4 0.37 5.9 1,3 RXCJ0001.9+1204 A2692 0.4877 12.0730 0.2033 0.08 1.82 1.81 17.9 3.24 5.1 1
RXCJ0004.9+1142 UGC00032 1.2473 11.7006 0.0761 0.17 3.78 3.68 12.7 0.93 5.3 2,4
RXCJ0005.3+1612 A2703 1.3440 16.2105 0.1164 0.24 4.96 4.94 11.8 2.88 3.7 B 2,5
RXCJ0006.3+1052 a)1.5906 10.8677 0.1698 0.15 3.28 3.28 19.3 4.05 5.6 1

我可以提供一个文件样本,如果必要的话

下面的代码在将每一行dict存储到第二个dict之前工作正常

#!/usr/bin/env python3
from collections import *
from re import *
obsrun = {}
objects = {}
re = compile('\d+.\d\d\d\d')

filename = 'test.asc'

with open(filename, 'r') as f:
    lines = f.readlines()

for l in line[2:]:
    #split the read lines into a list
    o_bject = l.split()
    #print(o_bject)
    #interate over each entry and people the line-dictionary with values of interest
    #what's needed (in col of table): identifier, common name, rightascension, declination 
    for k in o_bject:
    objects.__setitem__('id', o_bject[0])
    objects.__setitem__('common_name', o_bject[1])
        # sometimes the common name has blanks, multiple entries or replacements
    if re.match(o_bject[2]):
        objects.__setitem__('ra', float(o_bject[2] ) )
        objects.__setitem__('dec', float(o_bject[3] ) )
    else:
        objects.__setitem__('ra', float(o_bject[3] ) )
        objects.__setitem__('dec', float(o_bject[4] ) )

    #extract the identifier (name of the object) for use as key
    name = objects.get('id')
    #print(name)

    print(objects) #*
    # as documented in http://stackoverflow.com/questions/1024847/add-to-a-dictionary-in-python
    obsrun[name] = objects
    #print(obsrun)

    #getting an ordered dictionary sorted by keys
    OrderedDict(sorted(obsrun.items(), key= lambda t: t[0] ) ) #t[0] keys,t[1] values
从控制台上的输出可以看出,内部for循环完成了应该做的事情。已通过*处的打印(对象)确认。 但当涉及到在第二个dict中将行dict存储为值时,则是具有相同值的人。钥匙是正确制造的

我不明白的是,print()命令显示了“objects”的正确内容,但它们没有正确地存储到“obsrun”中。 错误是在dict观点中,还是我做错了什么

我应该如何改进代码

提前感谢,,
Christian

您只创建了一个字典,因此每次循环都在修改同一个字典

移动线路

objects = {}
进入第[2::]行中l的
循环。这将为文件的每一行创建一个单独的dict

此外,直接使用
\uuuuu setitem\uuuuu
是不必要的,这会使代码更难阅读。将行从
对象更改为
对象['id',o_对象[0])
对象['id']=o_对象[0]

那么你说,将“对象”赋予obsrun只是链接“对象”,而不是复制内容?所以我必须保留每一条内在的指令,因为它只是链接在一起的

关于setitem你是对的。我用它来让我更清楚,我到底在那里做什么

我将尝试将objects={}移动到内部for循环中

谢谢你的回答。如果真是这样,我会回去报告的

更新:成功了!非常感谢,我真的被困在那里了,但我学到了一些关于字典的重要知识,在这种情况下,它们只是链接起来的,所以已经节省了内存。 干杯
Christian

值得指出的是,除非你试图按名字查找条目,否则你并不真正需要一个dict of dict。(在这里,您没有详细解释用例是什么。)

<>你从代码中跳出来的一件事是你使用的是StITEMs>强>很多——我想你可能来自C++或java,字典里没有内置语言支持。在Python中,情况并非如此——您可以说d[key]=value来向字典添加项

下面是一些创建字典列表(数组)的代码。让表成为一个键入其中一个字段的字典是非常简单的。我会留给你去弄清楚的。:)

或者,如果您的问题是对数据执行计算,那么列表比dict更容易迭代。因此,如果您必须相加或求平均值或求最小/最大值,您可能需要此版本。 #!/usr/bin/env蟒蛇3-tt

data = open('test.asc')
header = data.readline().replace('-', '')

Field_names = header.split('|')
Table = []

# Read in the remaining lines, one at a time
for line in data:
    fields = line.split()
    Table.append(dict(zip(Field_names, fields)))

from pprint import pprint

pprint(Table)