Python 2.6以字典格式(.py文件)将字典多行导出到Python文件

时间:2017-06-20 21:32:13

标签: python python-2.7 dictionary

我已经探讨了其他问题,我并不惊讶地发现没有符合我需要的答案。

我正在吸收现有项目,需要对其进行一些改进。一个完整的重写是远在将来,并且目前不可能改变文件格式,因此我需要一个解决方法。

数据源是一个数据库,具有键/值对字段。

我正在选择数据库并导出。

问题:

我们正在创建一个新词典,然后解析它。

output = []
output.append("dictionary = {" + "\n")
# dbdata is just a dictionary of data from the database containing key and value
for result in dbdata
    output.append("\"" + str(result['key']) + "\" : \"" + str(result['value']) + "\",")
output.append("}")
response = "\n".join(output)

我们现在有一个非常大的字典将被打印出来。

当前系统的输出是:

dictionary = {
    "one": "one value",
    "two": "two value",
    'three': '
    12345/54321*23:Some-Magic/Stuff
    12345/54331*23:Some-Magic/Stuff
    12345/54321*21:Some-Magic/Stuff
    12345/54321*53:Some-Magic/Stuff
    12341/54321*23:Some-Magic/Stuff
    12343/54321*23:Some-Magic/Stuff
    12347/54321*23:Some-Magic/Stuff
    12145/54321*23:Some-Magic/Stuff',
    "four":"four value", 
    'five': "['this','is','another']", 
}

所需的格式如下所示:

dictionary = {
    "one": "one value",
    "two": "two value",
    "three": """
    12345/54321*23:Some-Magic/Stuff
    12345/54331*23:Some-Magic/Stuff
    12345/54321*21:Some-Magic/Stuff
    12345/54321*53:Some-Magic/Stuff
    12341/54321*23:Some-Magic/Stuff
    12343/54321*23:Some-Magic/Stuff
    12347/54321*23:Some-Magic/Stuff
    12145/54321*23:Some-Magic/Stuff""",
    "four":"four value", 
    "five":['this','is','another'],
}

注意:您将在现有内容中看到:

  • 引用键“五”时不应该
  • 不要三重引用“三”,因为它应该是一个多行值。

注意为什么这不是重复:

  • 格式无法更改为更合理/更合理的格式,即CSV,JSON,YML - 所有其他线程(非常正确)建议更改格式。
  • 必须保持人类可读性的多行格式

是的我觉得它很荒谬,因为它不是一种非常人性化的格式。

对于长篇文章感到抱歉,这是一个难以解释的问题 - 我意识到这一切都是糟糕的设计。

感谢任何能提供帮助的人。

1 个答案:

答案 0 :(得分:0)

我想出来 - 至少对我自己的用例来说。

为清楚起见,我正在执行以下操作:

  • 检查是否有JSON
  • 检查是否有Python列表
  • 如果是String,请引用它
  • 如果是多行,请使用三重引号

以下是解决我问题的代码 - 当然,如果有更好的方法可以做到这一点,我很乐意知道。

import ast
import json


dictionary = {
    "one": "one value",
    "two": "two value",
    "three": """
    12345/54321*23:Some-Magic/Stuff
    12345/54331*23:Some-Magic/Stuff
    12345/54321*21:Some-Magic/Stuff
    12345/54321*53:Some-Magic/Stuff
    12341/54321*23:Some-Magic/Stuff
    12343/54321*23:Some-Magic/Stuff
    12347/54321*23:Some-Magic/Stuff
    12145/54321*23:Some-Magic/Stuff""",
    "four": "four value",
    "five": "['this','is','another']",
}


def export_python_formatting(input):
    output = "config = { \n"
    evalVal = ""

    for key, value in input.items():
        isJSON = False
        output += "    "
        key = str(key)


        # See if the value is correct JSON

        try:
            z = json.loads(value)
            # Valid JSON - This might be a possible datatype in my use case.
            output += '"' + key + '"' + ":" + "'''" + value + "'''"
            evalVal = value
            isJSON = True
        except:
            # Invalid JSON - So let's use literal_eval to see if it contains a list
            try:
                evalVal = ast.literal_eval(value)
            except SyntaxError:
                evalVal = value
            except ValueError:
                print("There was a value error with " + key)

        varType = type(evalVal)

        # print(varType)
        if varType is str:
            if "\n" in value:
                output += '"' + key + '"' + ":" + "'''" + value + "'''"
            else:
                if isJSON is False:
                    output += '"' + key + '"' + ":" + '"' + value + '"'
        else:
            output += '"' + key + '"' + ":" + str(value)

        output += ",\n"

    output  += "}"
    return output


x = export_python_formatting(dictionary)
print(x)

感谢所有帮助过的人。