在python中为太阳系程序存储planetdata

时间:2019-01-27 12:20:24

标签: python database

我一直在创建一个太阳系仿真程序,作为在python中进行娱乐和练习的项目。我面临的问题是,将行星的数据存储在.py本身中变得越来越忙。示例:

    #shaped as: name, parent, type, size, orbital radius (AU), x, y, r, t, hidden, theta, orbitalperiod (y), color
    #for type 0=sun, 1=planet, 2=moon, 3=asteroid (unused)
    #x, y, r and t start as 0 and get assigned values later on. hidden is 0 or 1, if obscured by body
solsystem = [('sun', 'none', 0, 20, 0, centerx, centery, 0, 0, 0, 0, 0, (255, 255, 0)),
             ('earth', 'sun', 1, 2, 1, 0, 0, 0, 0, 0, 0, 1, (0, 0, 255)),
             ('luna', 'earth', 1, 1, 0.04, 0, 0, 0, 0, 0, 0, 0.075, (169,169,169)), #actual radius is 0.00254
             ('venus', 'sun', 1, 2, 0.675, 0, 0, 0, 0, 0, 0, 0.616, (255,255,0)),
             ('mercury', 'sun', 1, 2, 0.387, 0, 0, 0, 0, 0, 0, 0.24, (169,169,169)),
             ('mars', 'sun', 1, 2, 1.524, 0, 0, 0, 0, 0, 0, 1.88, (255, 0, 0)),
             ('jupiter', 'sun', 1, 4, 5.20, 0, 0, 0, 0, 0, 0, 11.86, (255, 0, 0)),
             ('io', 'jupiter', 1, 1, 0.08, 0, 0, 0, 0, 0, 0, 0.00484, (169,169,169)), #different radiuses for moons to keep visibility
             ('europa', 'jupiter', 1, 1, 0.12, 0, 0, 0, 0, 0, 0, 0.0097, (169,169,169)),
             ('ganymede', 'jupiter', 1, 1, 0.16, 0, 0, 0, 0, 0, 0, 0.0195, (169,169,169)),
             ('callisto', 'jupiter', 1, 1, 0.2, 0, 0, 0, 0, 0, 0, 0.0456, (169,169,169))]

这就是我目前要添加的内容,我计划添加小行星,更多的行星和卫星以及所有其他东西...这样做的更好方法是什么?为了以更有条理的方式存储数据,例如电子表格之类的数据,因此我可以根据需要轻松添加更多值。

完整的代码供您参考:https://pastebin.com/L8n23bLt(它工作得相当不错,但是我仍然想解决很多纠结和错误。对于我在这里做错的事情的任何提示,也应该感谢!)

3 个答案:

答案 0 :(得分:0)

如果您和您的项目都可以,则可以像这样确定存储值。

我更喜欢使用 library configparser json文件

ConfigParser vs JSON files for config

以下是我的项目中的示例

def get_current_scenario_number():
    """
    Get scenario number from temporary config.
    :return:
    """
    config = configparser.ConfigParser()
    config.read('scenario_data.ini')
    scenario_number = config['scenario_data']['scenario_config']
    return int(scenario_number)


def set_current_scenario_number(scenario_number):
    """
    Change scenario number  in temporary config.
    :param scenario_number:
    :return:
    """
    config = configparser.ConfigParser()
    config.read('scenario_data.ini')
    try:
        config['scenario_data']['scenario_config'] = str(scenario_number)
    except KeyError:
        config.add_section('scenario_data')
        config.set('scenario_data', 'scenario_config', str(scenario_number))
    with open('scenario_data.ini', 'w') as configfile:
        config.write(configfile)

答案 1 :(得分:0)

下一步,请考虑一个简单的csvyaml文件。两者都将允许您显式命名字段并将元素读取为字典。如果手动维护文件太麻烦,请考虑使用sqlite

答案 2 :(得分:0)

在此空间中,有很多选项都可以正常工作。最简单的方法是存储所有对象的csv文件(基于文本的电子表格),然后您可以使用标准库的csv模块读取并解析该文件。

您的CSV文件可能如下所示:

"sun","none",0,20,0,111,111,0,0,0,0,0,"(255,255,0)"                             
"earth","sun",1,2,1,0,0,0,0,0,0,1,"(0,0,255)"                                   
"luna","earth",1,1,0.04,0,0,0,0,0,0,0.075,"(169,169,169)"
...

读取代码如下:

import csv, ast
with open('test.csv') as csvfile: 
    reader = csv.reader(csvfile, quoting=csv.QUOTE_NONNUMERIC) 
    solsystem = [] 
    for row in reader: 
        solsystem.append(row) 
        solsystem[-1][12] = ast.literal_eval(solsystem[-1][12]) 

一种类似的替代方法是使用JSON,YAML或XML格式化文件,然后使用标准库的jsonxml模块读取和解析。

在空间更复杂的一端是完整的关系(和非关系)数据库。您的用例,加上标准库中有一个sqlite3模块的事实,使得sqlite在此领域是一个很好的潜在选择。