2012-05-08 15 views
26

有沒有辦法做到這一點?說我有一個文件,該文件即是這樣的名單:用Python在文件的中間插入行?

  1. 阿爾弗雷德
  2. 比爾
  3. 唐納德

我怎麼能插入第三個名字,「查理」,在行x(在這種情況下是3),並自動發送所有其他人下來一行?我已經看到過類似的其他問題,但他們沒有得到有用的答案。它可以完成,最好使用方法或循環?

+0

我懷疑你沒有找到解決方案,這與一些基礎研究。你確定你已經完成了嗎? –

+2

@AbhranilDas感謝tkbx的良好措辭我立即找到了答案! – dmeu

+0

相關:[如何在閱讀文本內容時向文本文件的中間寫入內容?](http://stackoverflow.com/q/16556944/4279) – jfs

回答

39

這是一種訣竅。

f = open("path_to_file", "r") 
contents = f.readlines() 
f.close() 

contents.insert(index, value) 

f = open("path_to_file", "w") 
contents = "".join(contents) 
f.write(contents) 
f.close() 

「指數」和「價值」是您所選擇的線路和價值,線條從0

+4

這可能比我的答案更乾淨,但是可以避免打開和關閉文件兩次。 – jordanm

+4

使用'f.writelines(contents)'而不是自己加入會更簡單嗎? – zekel

+0

contents.insert(x,y)我喜歡這個,簡單 –

2
  1. 解析文件到使用file.readlines()file.read().split('\n')
  2. 確定的位置,你必須插入一個新行Python列表,根據自己的標準。
  3. 使用list.insert()在那裏插入一個新的列表元素。
  4. 將結果寫入文件。
+3

只需注意一點,'file.read.split('\ ''''應該是'file.read()。split('\ n')' – Harry

5

起您只需將數據讀入一個列表,並插入您希望新記錄。

names = [] 
with open('names.txt', 'r+') as fd: 
    for line in fd: 
     names.append(line.split(' ')[-1].strip()) 

    names.insert(2, "Charlie") # element 2 will be 3. in your list 
    fd.seek(0) 
    fd.truncate() 

    for i in xrange(len(names)): 
     fd.write("%d. %s\n" %(i + 1, names[i])) 
4

你不告訴我們,輸出應該是什麼樣子,那麼一個可能的解釋是,您要使用這個輸出:

  1. 阿爾弗雷德
  2. 比爾
  3. 查理
  4. Donald

(Insert Charlie,then add 1所有後續行)這裏是一個可能的解決方案:

def insert_line(input_stream, pos, new_name, output_stream): 
    inserted = False 
    for line in input_stream: 
    number, name = parse_line(line) 
    if number == pos: 
     print >> output_stream, format_line(number, new_name) 
     inserted = True 
    print >> output_stream, format_line(number if not inserted else (number + 1), name) 

def parse_line(line): 
    number_str, name = line.strip().split() 
    return (get_number(number_str), name) 

def get_number(number_str): 
    return int(number_str.split('.')[0]) 

def format_line(number, name): 
    return add_dot(number) + ' ' + name 

def add_dot(number): 
    return str(number) + '.' 

input_stream = open('input.txt', 'r') 
output_stream = open('output.txt', 'w') 

insert_line(input_stream, 3, 'Charlie', output_stream) 

input_stream.close() 
output_stream.close() 
11

如果你要搜索一個文件的子串,並添加一個新的文本到下一行,優雅的方式做一個如下:

import fileinput 
for line in fileinput.FileInput(file_path,inplace=1): 
    if "TEXT_TO_SEARCH" in line: 
     line=line.replace(line,line+"NEW_TEXT") 
    print line, 
+4

在python3上,'print(line,end ='')'對於不在行間插入額外換行符很有用。 –

1

還有就是我在解決這一問題找到有用的技術組合:

with open(file, 'r+') as fd: 
    contents = fd.readlines() 
    contents.insert(index, new_string) # new_string should end in a newline 
    fd.seek(0) # readlines consumes the iterator, so we need to start over 
    fd.writelines(contents) # No need to truncate as we are increasing filesize 

在我們特定的應用,我們希望它某些字符串後加:

with open(file, 'r+') as fd: 
    contents = fd.readlines() 
    if match_string in contents[-1]: # Handle last line to prevent IndexError 
     contents.append(insert_string) 
    else: 
     for index, line in enumerate(contents): 
      if match_string in line and insert_string not in contents[index + 1]: 
       contents.insert(index + 1, insert_string) 
       break 
    fd.seek(0) 
    fd.writelines(contents) 

如果你希望它在比賽的每個實例後插入的文本,而不是僅僅是第一,取出else:(並適當取消縮進)和break

還請注意and insert_string not in contents[index + 1]:阻止它在match_string之後添加多個副本,因此可以反覆運行。