我使用RTF模板收集数据:
{\rtf1\ansi\deff0 {\fonttbl {\f0 Monotype Corsiva;}}
\f0\fs28 Here be %(data)s
}
我有一个单独的模板用于追加操作,就像上面没有第一行一样。
挑战在于,在创建文件时,稍后可能会有相同文件名的其他数据。可以将数据附加到文件中,但我还没有找到摆脱"}"的方法。如果文件存在,则为EOF语法。这是在不删除最后一行的情况下附加数据的代码:
rtf_filename = time.strftime("%d") + ".rtf" # rtf filename in date format
template = open("template.rtf").read() # rtf template
template_append = open("template_append.rtf").read() # rtf append template
data_source = {"data": "test_data"} # just a string to keep this simple
if os.path.isfile(rtf_filename) is True: # RTF file might exist
with open(rtf_filename, "a") as f:
f.write(template_append % data_source)
else:
with open(rtf_filename, "w") as f:
f.write(template % data_source)
上述代码的文件输出:
{\rtf1\ansi\deff0 {\fonttbl {\f0 Monotype Corsiva;}}
\f0\fs28 Here be test_data
}\f0\fs28 Here be test_data # line where "}" should be removed
}
感谢您的帮助。
答案 0 :(得分:1)
此代码
with open(rtf_filename, "a") as f:
f.write(template_append % data_source)
只需直接附加到新打开的文件的末尾。
由于这些文件似乎是小文件,如果您只是将文件读入列表,删除列表末尾的结束}
,将新数据附加到列表中,最后将是最简单的文件。把文件写回来。您可以在适当的位置覆盖该文件,或使用临时文件,然后将原始文件替换为临时文件,如下所示:
import shutil
from tempfile import NamedTemporaryFile
rtf_filename = time.strftime("%d") + ".rtf" # rtf filename in date format
template = open("template.rtf").read() # rtf template
template_append = open("template_append.rtf").readlines()
data_source = {'data': 'test_data'}
if os.path.isfile(rtf_filename) is True: # RTF file might exist
with open(rtf_filename) as rtf_file, NamedTemporaryFile(dir='.', delete=False) as tmp_file:
lines = rtf_file.readlines()[:-1] # reads all lines and truncates the last one
lines.extend([s % data_source for s in template_append])
tmp_file.writelines(lines)
shutil.move(tmp_file.name, rtf_filename)
else:
with open(rtf_filename, "w") as f:
f.write(template % data_source)