我正在制作一个将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'...
中控制/写入所有内容。但这看起来过于复杂,因为我必须再次存储事件的副本,但作为表,然后才用它做一些事情。
答案 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])
注意我使用上下文管理器来正确处理文件的打开和关闭。