将数据输入到字典(Inputting data into dictionary)

2019-10-17 10:37发布

所以,我对于例如文本文件:

RootObject: Sun

Object: Sun
Satellites: Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris
Radius: 20890260
Orbital Radius: 0

Object: Earth
Orbital Radius: 77098290
Period: 365.256363004
Radius: 6371000.0
Satellites: Moon

Object: Moon
Orbital Radius: 18128500
Radius: 1737000.10
Period: 27.321582

我试图将其输入到字典中。 这是我迄今为止,但我不断收到错误...

#d = dictionary
#new_d = new dictionary

file = open("data.txt","r")
d = {}
def data(file):
    for line in file:
        if line != line.strip:
            continue
        line = line.strip()
        key = line.split(":")
        val = line.split(":")
        if key in d and key == "Object":
            print(d)
        d[key] = val
    print(d)

new_d = {}
with file as x:
    for d in data(x):
        new_d[d["Object"]] = d
print(nd)

我应该得到这样的事情:

{' Earth': {'Satellites': ' Moon', 'Orbital Radius': ' 77098290', 'Object': ' Earth', 'Radius': ' 6371000.0', 'Period': ' 365.256363004'}, ' Moon': {'Orbital Radius': ' 18128500', 'Object': ' Moon', 'Radius': ' 1737000.10', 'Period': ' 27.321582'}, ' Sun': {'Satellites': ' Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris', 'Orbital Radius': ' 0', 'Object': ' Sun', 'Radius': ' 20890260', 'RootObject': ' Sun'}}

我得到这个错误:

Traceback (most recent call last):
  File "planet2.py", line 21, in <module>
    for d in data(x):
TypeError: 'NoneType' object is not iterable

Answer 1:

这将很好地做:

file = open("data.txt","r")

def data(file):
    dic = {}
    for line in file:
        # If line not blank
        if line.strip() != '':
            key,value = line.split(":")
            if key == 'RootObject':
                dic[key] = value.strip()
            elif key == 'Object':
                # Get the Object value i.e Earth, Moon, Sun                
                obj = value.strip()
                # Create entry with obj key and blank dictionary value
                dic[obj]={}
            else:
                # Populate the blank dictionary with key, value pairs
                dic[obj][key] = value.strip()
    return dic

planets = data(file)

# Usage
print planets
print planets['Earth']
print planets['Earth']['Radius']

输出:

# The whole dictionary 
{'Sun': {'Satellites': 'Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris', 'Orbital Radius': '0', 'Radius': '20890260'}, 'Moon': {'Orbital Radius': '18128500', 'Radius': '1737000.10', 'Period': '27.321582'}, 'Earth': {'Satellites': 'Moon', 'Orbital Radius': '77098290', 'Radius': '6371000.0', 'Period': '365.256363004'}}

# The Earth dictionary
{'Satellites': 'Moon', 'Orbital Radius': '77098290', 'Radius': '6371000.0', 'Period': '365.256363004'}

# The Earth's radius
6371000.0


Answer 2:

有在你的代码的几个不同的错误。 这是造成你的例外之一是,你的函数data写入到一个全局变量,并且不返回任何东西,但你以后的代码期望它返回的东西可迭代,如序列或发电机。

你可以通过直接使顶级代码迭代的全局字典解决这个问题,或者你可以摆脱全球,创造内字典data ,并在年底返回。 我认为是后者,因为全局变量是很难处理的代码变得更加复杂。

这里有一个如何,应该工作粗线条(我要离开的中间部分粗略的,因为我将在后面讨论):

def data(file):
    objects = {}

    # add stuff to objects dict

    return objects

你的下一个错误是剥离你的线条。 您的代码目前测试每一行都有自己的不平等strip方法。 这是在Python 3的误差,由于lineline.strip具有无可比拟的类型。 但即使它的工作,这将是毫无意义的。 我怀疑你是试图消除空行,首先剥夺他们并拒绝任何是空之后。 这里是你如何能做到这一点:

if not line.strip():
    continue

这是一些人在Python社区调用(LBYL)的编程风格,因为你检查的东西变成一个之前可能是一个问题,“三思而后行”的一个例子。 另一种是“更容易请求原谅比许可”(EAFP)的风格,你只需换地方的麻烦可能会在出现的区域try块,赶上所生成的例外。 EAFP风格有时被认为是更“Python化”,所以稍后我会展示风采。

下一个错误是一个合乎逻辑的,而不是东西,这将导致错误。 你区分你行,你想获得两个部分的入变量keyvalue 。 但是,你正在做的两个单独分配到这些变量,而事实上他们在每个相同的值结束了。 这是你使用Python语法的一个很酷的功能,拆包的地方。 代替单独分配每个可变的,则可以一起分配二值序列(如列表或元组),以两者。 Python会采取给第一个值的第一变量和第二值到第二个变量照顾。 这里是什么样子:

key, value = line.split(":")

如果有当然在行中没有冒号这会失败,所以这是一个好地方,为我们上演一try ,如果我们使用编码的EAFP风格的块。 下面是做这件事:

try:
    key, value = line.split(":")
except ValueError:
    continue

您可以改为把try周围的一切块保留在循环,然后让except块仅包含pass (这什么也不做,但忽略除外)。

最后,你有最后的逻辑错误与你如何建立你的嵌套字典做。 您当前的做法是先建立与所有从你的文件中的密钥和值的单一的字典,然后将它们分割成独立的部分,每一个天体。 但是,如果每个对象的密钥是相同的,这并不工作。 由于每个对象都有一个“轨道半径”键,例如,他们都将被写在彼此把该键到单个字典。

@ sudo_o的回答显示了如何构建内部字典,并用填充值(它几乎是相同的东西,我会写)。 我只是想后我解释的休息!



文章来源: Inputting data into dictionary