2013-06-02 50 views
3

我很難找到答案,經過相當多的搜索。 我想要做的是,根據我的字符串,在字符串上方或下方進行字符串搜索和寫入。如何將字符串寫入特定的行號?

這裏是我到目前爲止已經完成的:最初的問題的

file = open('input.txt', 'r+') 
f = enumerate(file) 
for num, line in f:  
    if 'string' in line:  
     linewrite = num - 1 
      ??????? 

編輯分機: 我已經挑選最能解決我最初的問題的答案。但是現在使用Ashwini的方法重寫了文件,我該如何搜索和替換一個字符串。更具體。

我有

SAMPLE 
AB 
CD 
.. 
TYPES 
AB 
QP 
PO 
.. 
RUNS 
AB 
DE 
ZY 

我想替換ABXX僅在SAMPLERUNS 我已經嘗試使用替代的多種方式()的文本文件。我想是這樣

if 'SAMPLE' in line: 
f1.write(line.replace('testsample', 'XX')) 
if 'RUNS' in line:  
f1.write(line.replace('testsample', 'XX')) 

,並沒有工作

+1

文件沒有 「線」。這是Python庫創建的抽象。在文件中間改變一行的唯一方法是讀取整個文件並重新寫入所有文件(當然,在某些情況下,您可以將其縮短但不是一般情況下)。 –

+0

等等...你想寫一個特定的行號碼還是寫入一個包含字符串的行? – refi64

+1

您的更新應作爲新問題發佈 –

回答

2

您可能需要先閱讀列表中的所有行,而且如果條件匹配你就可以存儲你的字符串在某一特定指數使用list.insert

with open('input.txt', 'r+') as f: 
    lines = f.readlines() 
    for i, line in enumerate(lines): 
     if 'string' in line: 
      lines.insert(i,"somedata") # inserts "somedata" above the current line 
    f.truncate(0)   # truncates the file 
    f.seek(0)    # moves the pointer to the start of the file 
    f.writelines(lines) # write the new data to the file 

或不保存所有的線,你需要一個臨時文件來存儲數據,然後 臨時文件重命名爲原始文件:

import os 
with open('input.txt', 'r') as f, open("new_file",'w') as f1: 
    for line in f: 
     if 'string' in line: 
      f1.write("somedate\n") # Move f1.write(line) above, to write above instead 
     f1.write(line) 
os.remove('input.txt') # For windows only 
os.rename("newfile", 'input.txt') # Rename the new file 
+0

@NathanLim哪一個,我發佈了兩個腳本。 –

+0

我用這個答案,因爲它做了一些我已經想要做的事情,比如重命名輸出文件。儘管@Jon Clements也工作得很好!謝謝你們! –

+0

我刪除了多餘的'f1.write(line)',並使代碼更符合PEP 8。 – EOL

3

以下可以作爲一個模板:

import fileinput 

for line in fileinput.input('somefile', inplace=True): 
    if 'something' in line: 
     print 'this goes before the line' 
     print line, 
     print 'this goes after the line' 
    else: 
     print line, # just print the line anyway 
相關問題