Python - 在追加

时间:2015-09-03 10:24:30

标签: python file rtf

我使用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
}

感谢您的帮助。

1 个答案:

答案 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)