2015-09-03 59 views
0

當去除目標的最後一行我用數據RTF模板我收集:Python的 - 附加

{\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

我不知道這個地方應該應用,因爲我不明白正是你在做什麼,但'new_template = template [:template.rfind('}')]'爲你工作?它採用模板並刪除最後一個括號到字符串末尾的所有內容。 –

+0

謝謝,這正是我試圖實現的目標,但不知道應該在哪裏實施。 – strongbad

回答

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) 
+0

謝謝你的幫助! – strongbad