将数组格式化为参数并控制/写入它

时间:2017-06-16 07:58:20

标签: python design-patterns

我正在制作一个将csv表作为输入并输出日历事件(ic)的工具。 在某些时候,我有一个策略,要么将事件的内容输出到控制台,要么将数据写入ics文件,因此将输出写入文件的方法如下所示:

def append_to_ics(event, day, file_name=None):
    output_file = open(file_name, 'a')
    output_file.write('BEGIN:VEVENT\n')
    output_file.write('DTSTART;TZID={}:{}T{}00\n'.format(event.TIME_ZONE, day.strftime('%Y%m%d'), event.start_time))
    output_file.write('DTEND;TZID={}:{}T{}00\n'.format(event.TIME_ZONE, day.strftime('%Y%m%d'), event.end_time))
    output_file.write('SUMMARY:{}\n'.format(event.class_title))
    output_file.write('DESCRIPTION: Teacher: {}; Type of class: {}\n'.format(event.teacher, event.class_type))
    output_file.write('LOCATION:{}\n'.format(event.location))
    output_file.write('TRANSP:OPAQUE\n')
    output_file.write('END:VEVENT\n\n')
    output_file.close()

'event'参数是一个包含时间,标题,教师等字段的对象。 'day'是一个datetime对象,'file_name'显然是我正在写的文件。 像控制台日志一样输出数据的方法看起来完全一样,但是没有文件打开/关闭,而不是output_file(),而是print()。

问题是:我想简化方法,这样我就不必为写入和控制台输出复制相同的代码,但我无法理解如何传递{{1 }} array/tuple/?..然后以某种方式格式化每个字段,然后将其发送到控制台的文件编写器。

我已尝试过的内容: 首先按照上面的方法格式化事件并将所有内容存储在表中,然后在'DTSTART;TZID={}:{}T{}00\n'...中控制/写入所有内容。但这看起来过于复杂,因为我必须再次存储事件的副本,但作为表,然后才用它做一些事情。

1 个答案:

答案 0 :(得分:2)

您可以使用{"类似文件的sys.stdout"标准输出的对象(因此,控制台)。

关于如何打开和关闭输出流不是append_to_ics的工作,所以你可以把它放在功能之外。

此外,由于您必须循环输出,我们还可以将最终字符串存储在变量中,以提高性能和可读性。

这将如下所示: import sys

def append_to_ics(event, day, outputs=None):
    outputs = outputs or []
    s = "\n".join([
        'BEGIN:VEVENT',
        'DTSTART;TZID={}:{}T{}00'.format(event.TIME_ZONE, day.strftime('%Y%m%d'), event.start_time),
        'DTEND;TZID={}:{}T{}00'.format(event.TIME_ZONE, day.strftime('%Y%m%d'), event.end_time),
        'SUMMARY:{}'.format(event.class_title),
        'DESCRIPTION: Teacher: {}; Type of class: {}'.format(event.teacher, event.class_type),
        'LOCATION:{}'.format(event.location),
        'TRANSP:OPAQUE',
        'END:VEVENT',
    ])

    for output in outputs:
        output.write(s)

# Call like this:
with open(file_name, 'a') as output_file:
    append_to_ics(event, day, [sys.stdout, output_file])

注意我使用上下文管理器来正确处理文件的打开和关闭。