2013-10-09 63 views
1

我正在製作一個python程序,從網站獲取數據,然後將其記錄在文本文件中。我希望這記錄最後1000(我正在測試4和字符串「你好」)條目,並刪除其餘的。以下是我迄今爲止:Python:從文本文件splitlines(),然後將它們寫回文本文件

f = open("test.txt", "r") 
text = f.read() 

f = open("test.txt", "w") 
content = text.splitlines(True) 
f.write("hello") 
f.write("\n") 

for x in range(0,4): 
    f.write(str(content[x:x+1]).strip('[]')) 

f.close() 

這個「作品」,然而格式化文本文件是這樣的:

hello 
'hello\n''\'hello\\n\'\'\\\'hello\\\\n\\\'\\\'\\\\\\\'hello\\\\\\\\n\\\\\\\'"\\\\\\\'hello\\\\\\\\\\\\\\\\n\\\\\\\'"\\\'\'' 

你能不能幫我弄清楚了這一點,所以它看起來是這樣的:

hello 
hello 
hello 
hello 

謝謝!

+0

你想要的最後1000個非空行?我不確定你在這裏過濾方案。 – GWW

+0

您是否意識到,您首先打開文件進行閱讀,然後在未關閉文件的情況下嘗試再次打開文件進行閱讀?我建議在第3行添加'f.close()',看看情況是否改善。爲了保持代碼清晰,在打開文件進行寫入之前,'content = text.splitlines(True)'會更好。 –

+0

我改成了這樣:'F =開放( 「test.txt的」, 「R」) 文本= f.read() 含量= text.splitlines(真) f.close() F =開放( 「test.txt的」, 「W」) f.write( 「你好」) f.write( 「\ n」 個) 在範圍X(0,4): \t f.write(STR (content [x:x + 1])。strip('[]')) f.close()'並沒有改進。 – pclever1

回答

0

使用deque,因爲它提供maxlen。添加行/單詞將只保留maxlen項目,新項目將被添加並忘記較舊的項目。

from collections import deque 
fname = "source.txt" 
last_lines = deque(maxlen = 4) 
with open(fname) as f: 
    text = f.read() 
    for line in text.splitlines(True): 
    last_lines.append(line) 
#f is closed when we leave the block 

outfname = fname 
with open(outfname, "w") as of: 
    for line in last_lines: 
    of.write(line) 

即使沒有分裂線(但您要求),您也可以做到這一點。

from collections import deque 
fname = "source.txt" 
last_lines = deque(maxlen = 4) 
for line in open(fname): 
    last_lines.append(line) 
#file is closed when we leave the (for) block 

outfname = fname 
with open(outfname, "w") as of: 
    for line in last_lines: 
    of.write(line) 

而使用的伎倆從喬恩·克萊門茨(創建雙端隊列使用從文件描述符作出迭代器),並允許自己使用不同的源文件和目標文件,它可以變得很短:

from collections import deque 
with open("target.txt", "w") as out_f: 
    for line in deque(open("source.txt"), maxlen = 4): 
    out_f.write(line) 
+0

謝謝,它效果很好! – pclever1

相關問題