Python 3.x Python3:文件中表内容的字典字典
手头的任务是,我必须将文件的表内容放入字典结构的字典中。 该文件包含如下内容:(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 1Python 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
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)