2012-05-08 33 views
26

Có cách nào để thực hiện việc này không? Nói rằng tôi có một tập tin đó là một danh sách tên mà đi như thế này:Chèn dòng ở giữa tệp bằng Python?

  1. Alfred
  2. Bill
  3. Donald

Làm thế nào tôi có thể chèn tên thứ ba, "Charlie", tại dòng x (trong trường hợp này 3), và tự động gửi tất cả những người khác xuống một dòng? Tôi đã nhìn thấy các câu hỏi khác như thế này, nhưng họ không nhận được câu trả lời hữu ích. Nó có thể được thực hiện, tốt nhất là với một phương pháp hoặc một vòng lặp?

+0

Tôi nghi ngờ bạn sẽ không tìm thấy giải pháp cho điều này với một số nghiên cứu cơ bản. Bạn có chắc bạn đã làm điều đó không? –

+2

@AbhranilDas nhờ vào từ ngữ tốt của tkbx Tôi ngay lập tức tìm thấy câu trả lời này! – dmeu

+0

liên quan: [Làm thế nào để ghi vào giữa một tập tin văn bản trong khi đọc nội dung của nó?] (Http://stackoverflow.com/q/16556944/4279) – jfs

Trả lời

39

Đây là cách để thực hiện thủ thuật.

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() 

"chỉ số" và "giá trị" là những dòng và giá trị của sự lựa chọn của bạn, dây chuyền bắt đầu từ 0.

+4

Điều này có lẽ là một chút sạch hơn so với câu trả lời của tôi, nhưng bạn có thể tránh mở và đóng tập tin hai lần. – jordanm

+4

Nó sẽ không đơn giản hơn để sử dụng 'f.writelines (nội dung)' thay vì tự mình tham gia? – zekel

+0

contents.insert (x, y) i như thế này, đơn giản –

2
  1. Phân tích các tập tin vào một danh sách python sử dụng file.readlines() hoặc file.read().split('\n')
  2. Xác định vị trí, nơi bạn có để chèn một dòng mới, theo tiêu chí của bạn.
  3. Chèn phần tử danh sách mới ở đó bằng cách sử dụng list.insert().
  4. Viết kết quả vào tệp.
+3

Chỉ cần một lưu ý, 'file.read.split ('\ n ') 'nên là' file.read(). split (' \ n ') ' – Harry

5

Bạn chỉ có thể đọc dữ liệu vào một danh sách và chèn kỷ lục mới, nơi bạn muốn.

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

Bạn không chỉ cho chúng ta những gì đầu ra sẽ giống như thế, vì vậy một giải thích có thể là bạn muốn điều này là đầu ra:

  1. Alfred
  2. Bill
  3. Charlie
  4. Donald

(Chèn Charlie, sau đó thêm 1 cho tất cả các dòng tiếp theo) Dưới đây là một giải pháp khả thi:.

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

Nếu bạn muốn tìm kiếm một tập tin cho một chuỗi con và thêm một văn bản mới vào dòng tiếp theo, một trong những cách thanh lịch để làm điều đó như sau:

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

Trên python3, 'print (line, end = '')' rất hữu ích để không chèn thêm dòng giữa các dòng. –

1

có một sự kết hợp của kỹ thuật mà tôi thấy hữu ích trong việc giải quyết vấn đề này:

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 

trong ứng dụng cụ thể của chúng tôi, chúng tôi muốn thêm nó sau một chuỗi nhất định:

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) 

Nếu bạn muốn nó để chèn chuỗi sau mỗi thể hiện của trận đấu, thay vì chỉ là người đầu tiên, loại bỏ các else: (và đúng unindent) và break.

Cũng lưu ý rằng and insert_string not in contents[index + 1]: ngăn không cho thêm nhiều bản sao sau match_string, do đó, an toàn để chạy liên tục.

Các vấn đề liên quan