使用缩进写入文本文件

时间:2020-04-27 13:08:28

标签: python

我是Python的新手,它试图编写Python代码,该代码将从excel文件中提取一些数据,并使用提取的数据创建文本文件(用作C语言头文件)。 我可以解析excel并提取相关数据,但是在以所需格式将数据写入文本文件时需要一些指导。

从Excel提取的数据看起来像这样

parameter_name = "Colour"
parameter_value = ["0x01","0x02","0x06","0x10"] 
parameter_value_desc = ["Black","White","Red","Indigo"]

提取的数据将以这种格式(创建枚举声明)写入文本文件

typedef enum Colour{Black = 0x01, 
                    White = 0x02, 
                    Red = 0x06, 
                    Indigo = 0x10};

如何写文本文件,使枚举的每个元素都显示在另一个元素之下,如上所示?

我只能写入文件,以便枚举元素并排放置,如下所示。

typedef enum Colour{Black = 0x01, White = 0x02, Red = 0x06, Indigo = 0x10};

但这是一个问题,当我们有更多的枚举元素时,在这种情况下,文本将超过每行80个字符的限制。

这是我的代码的外观

def write_to_file(parameter_value, parameter_value_desc, parameter_name):
    with open("out_file.h", "a") as f:
        print("typedef enum {}".format(parameter_name) + "{", file=f, end="")
        for value, desc in zip(parameter_value, parameter_value_desc):
            print("{} = 0x{}".format(str(desc), str(value)), file=f, end=",")
        print("};", file=f, end="\n")

3 个答案:

答案 0 :(得分:1)

这看起来像是str.join的任务。我将按照以下方式进行操作:

parameter_name = "Colour"
parameter_value = ["0x01","0x02","0x06","0x10"] 
parameter_value_desc = ["Black","White","Red","Indigo"]
with open("out_file.h", "a") as f:
    print("typedef enum {}".format(parameter_name) + "{", file=f, end="")
    indent_size = len("typedef enum {}".format(parameter_name) + "{")
    print((",\n" + " "*indent_size).join("{} = {}".format(str(desc), str(value)) for value, desc in zip(parameter_value, parameter_value_desc)), file=f, end="")
    print("};", file=f, end="\n")

out_file.h内容:

typedef enum Colour{Black = 0x01,
                    White = 0x02,
                    Red = 0x06,
                    Indigo = 0x10};

我计算了要对齐并与元素连接所需的空间,换行符需要的空间数量。

答案 1 :(得分:0)

这是Daweo's answer的一种变体,主要是试图使with块的工作量减少:

start = f'typedef enum {parameter_name}{{'
sep = ',\n' + ' '*len(start)
values = (f'{d} = {v}' for v, d in zip(parameter_value, parameter_value_desc))
with open("out_file.h", "a") as f:
    print(f'{start}{sep.join(values_fmtd)}}};', file=f)

答案 2 :(得分:-1)

伪代码:

for (i, value) in enumerate(values):
    if i==0:
        out = first_line
    else:
        out = " " * len(first_line)
    out += value
    if i == len(values) - 1:
        out += last_line
    else:
        out += ",\n"
    print(out)

其中first_linetypedef enum Colour{

相关问题