Вопрос по python – Вставить строку в середине файла с Python?

43

Есть ли способ сделать это? Скажем, у меня есть файл со списком имен, который выглядит следующим образом:

  1. Alfred
  2. Bill
  3. Donald

Как я могу вставить третье имя, «Чарли», в строку x (в данном случае 3) и автоматически отправить всех остальных на одну строку? Я видел другие вопросы, подобные этому, но они не получили полезных ответов. Можно ли это сделать, желательно с помощью метода или цикла?

@AbhranilDas благодаря хорошей формулировке tkbx я сразу нашел этот ответ! dmeu
Я сомневаюсь, что вы не найдете решения этой проблемы с помощью некоторых фундаментальных исследований. Вы уверены, что сделали это? Abhranil Das

Ваш Ответ

7   ответов
15

щую строку, один из элегантных способов сделать это - это следующее:

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,
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededprint(line, end='')Error: User Rate Limit Exceeded
4

как должны выглядеть выходные данные, поэтому одна из возможных интерпретаций заключается в том, что вы хотите использовать это в качестве выходных данных:

Alfred Bill Charlie Donald

(Вставьте Чарли, затем добавьте 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()
3
Parse the file into a python list using file.readlines() or file.read().split('\n') Identify the position where you have to insert a new line, according to your criteria. Insert a new list element there using list.insert(). Write the result to the file.
Просто записка,file.read.split('\n') должно бытьfile.read().split('\n')
0

но неэффективный способ - прочитать весь контент, изменить его, а затем переписать:

line_index = 3
lines = None
with open('file.txt', 'r') as file_handler:
    lines = file_handler.readlines()

lines.insert(line_index, 'Charlie')

with open('file.txt', 'w') as file_handler:
    file_handler.writelines(lines)
3

которые я нашел полезными для решения этой проблемы:

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так что безопасно запускать повторно.

Error: User Rate Limit Exceededwith x as y:Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededwith open(file, 'r+') as fd:Error: User Rate Limit Exceededfclose()?
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]))
53

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

& Quot; индекс & Quot; и "значение" это строка и значение по вашему выбору, строки начинаются с 0.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededf.writelines(contents)Error: User Rate Limit Exceeded

Похожие вопросы