首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中用于生成报表的简单解释器

问python中用于生成报表的简单解释器
EN

Stack Overflow用户
提问于 2014-08-25 11:10:13
回答 1查看 116关注 0票数 1

我想要处理一个标签分隔的输入数据文件与头,并生成一个标签分隔输出文件根据模板。

下面是一个小场景:

数据文件:

代码语言:javascript
复制
A B C
1 4 7
2 5 8
3 6 9

定义输出中列的模板文件:

代码语言:javascript
复制
A:A
BC:B+C
HC:C/2, precision:2

模板文件包含以下操作:创建新列、对列进行求和和除法操作以及定义列中有理数的精度。

输出文件:

代码语言:javascript
复制
A BC HC
1 11 3.50
2 13 4.00
3 15 4.50

我从哪里开始用python编写解释器呢?解释器将解析模板文件,然后根据所解析的模板文件使用输入数据生成输出数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-25 11:27:28

为可变data.txt长度更新

也许你应该用主管调查一下。这允许您在模板中包含实际的python代码。

data.txt:

代码语言:javascript
复制
A B C D
1 4 7 2
2 5 8 5
3 6 9 8

template.txt:

代码语言:javascript
复制
headers = ['A', 'BC', 'HC', '3/D']
process = [ lambda params: int(params[0]), 
            lambda params: int(params[1]+params[2]),  
            lambda params: float('%.2f' % (params[2]/2)), 
            lambda params: float('%.2f' % (3. / params[3]))]

report_gen.py:

代码语言:javascript
复制
with open ("data.txt", "r") as myData:
    data = myData.readlines()

with open ("template.txt", "r") as myTemplate:
    template = myTemplate.read()

file = open("output.txt", "w")

exec(template)
for line in data:
    params = line.split(' ')
    if (params[0].isdigit()):
        for i in range(len(params)):
            params[i] = float(params[i])
        results = [None] * len(headers) #headers from eval'd template
        for i in range(len(headers)):
            # this is where we call our lambdas
            # which will calculate the colums based on the data for this row
            results[i] = str(process[i](params))
        file.write(" ".join(results) + "\n");
    else:
        file.write(" ".join(headers) + "\n")
file.close()

现在,具有data.txt和template.txt的目录中的python template.txt将生成:

output.txt:

代码语言:javascript
复制
A BC HC 3/D
1 11 3.5 1.5
2 13 4.0 0.6
3 15 4.5 0.38
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25484584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档