Python 如何将文本文件提取到词典中

Python 如何将文本文件提取到词典中,python,dictionary,Python,Dictionary,我想知道如何用python将文本提取到字典中。文本文件的格式是这样的(见下文)并以这样的方式提取,例如,对象earth是关键点,其半径、周期和所有都在关键点内 RootObject: Sun Object: Sun Satellites: Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris Radius: 20890260 Orbital Radius: 0 Ob

我想知道如何用python将文本提取到字典中。文本文件的格式是这样的(见下文)并以这样的方式提取,例如,对象earth是关键点,其半径、周期和所有都在关键点内

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

假设要将具有逗号分隔值的元素作为列表,请尝试:

mydict={}
with open(my_file,'r') as the_file:
    for line in the_file:
        if not line.strip(): continue # skip blank lines
        key,val=line.split(": ")
        val = val.split(",")
        mydict[key] = val if len(val) > 1 else val[0]

使用上述其中一项的修改,您将得到如下结果:

def read_next_object(file):    
        obj = {}               
        for line in file:      
                if not line.strip(): continue
                line = line.strip()                        
                key, val = line.split(": ")                
                if key in obj and key == "Object": 
                        yield obj                       
                        obj = {}                              
                obj[key] = val

        yield obj              
planets = {}                   
with open( "test.txt", 'r') as f:
        for obj in read_next_object(f): 
                planets[obj["Object"]] = obj    

print planets                  
{   'Earth': {   'Object': 'Earth',
             'Orbital Radius': '77098290',
             'Period': '365.256363004',
             'Radius': '6371000.0',
             'Satellites': 'Moon'},
     'Moon': {   'Object': 'Moon',
            'Orbital Radius': '18128500',
            'Period': '27.321582',
            'Radius': '1737000.10'},
     'Sun': {   'Object': 'Sun',
           'Orbital Radius': '0',
           'Radius': '20890260',
           'RootObject': 'Sun',
           'Satellites': 'Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris'}}
修复
RootObject
的情况,我相信这是您从发布的示例数据中查找的最后一个字典。这是一本行星词典,每一颗行星都是它的信息词典

print planets["Sun"]["Radius"]
应打印值
20890260

上面的输出如下所示:

def read_next_object(file):    
        obj = {}               
        for line in file:      
                if not line.strip(): continue
                line = line.strip()                        
                key, val = line.split(": ")                
                if key in obj and key == "Object": 
                        yield obj                       
                        obj = {}                              
                obj[key] = val

        yield obj              
planets = {}                   
with open( "test.txt", 'r') as f:
        for obj in read_next_object(f): 
                planets[obj["Object"]] = obj    

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

{
    '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',
        'RootObject': 'Earth'
         },

    'Earth':
        {
        'Satellites': 'Moon',
        'Orbital Radius': '77098290',
        'Radius': '6371000.0',
        'Period': '365.256363004',
        'RootObject': 'Sun'
        }
    }

实际上,由于冲突,即使是我的编辑也不够。需要OPyes提供更多信息-不幸的是,在做它所说的事情时,这个答案并不能真正回答问题。。而且它在处理过程中也会丢失数据。您希望得到什么样的结果?一本普通的字典不太管用,因为你的一些关键点是重复的。想把一个太阳系变成动画吗quickdraw@tomsmith-你能用你想要的输入示例格式的输出更新问题吗?很难说出你想从这个问题中得到什么。输入中应该有空行吗?看起来会有,但那可能只是一个格式问题…?我一直看到这个作业出现…你的老师怎么办?难道他们不能像rational讲师一样给你JSON吗?为什么他们让学生解析
字符的文本文件?你能改进这一点吗,以便将数字解析为python小数,将卫星解析为元组?我想补充一点,但由于OP没有包括他们的意图,或者说他们的原始尝试,他们可以将这些琐碎的添加到代码中。我觉得这个解决方案也应该在很大程度上回答这个问题。回溯(最近一次调用最后一次):文件“a4.py”,第14行,在行星[obj][“Object”]=obj TypeError:unhable type:“dict”谢谢你如何使“Root Object”像“Sun”“Moon”一样成为主键如何将卫星(如10)拆分为一个列表您可以使用python字符串上的
split
函数将卫星拆分为一个列表。至于另一个,只需寻找它并像行星一样返回,然后修改第二部分,将行星放入主列表,以便正确添加。OP:一定要告诉你的老师给他们未来的学生JSON,强迫学生做这种枯燥的工作以获得更有趣的主题是疯狂的。