Вставить строку в начале каждой строки - PullRequest
9 голосов
/ 03 октября 2011

Как мне вставить строку в начале каждой строки в текстовом файле, у меня есть следующий код:

f = open('./ampo.txt', 'r+')
with open('./ampo.txt') as infile:
    for line in infile:
        f.insert(0, 'EDF ')
f.close

я получаю следующую ошибку:

"'file'У объекта нет атрибута' insert '"

Обратите внимание, что я - полное программирование n00b.

Ответы [ 5 ]

21 голосов
/ 03 октября 2011

Python поставляется с батареями в комплекте :

import fileinput
import sys

for line in fileinput.input(['./ampo.txt'], inplace=True):
    sys.stdout.write('EDF {l}'.format(l=line))

В отличие от уже опубликованных решений, это также сохраняет права доступа к файлам.

7 голосов
/ 03 октября 2011

Вы не можете изменить файл в таком месте.Файлы не поддерживают вставку.Вы должны прочитать все это, а затем записать все снова.

Вы можете делать это построчно, если хотите.Но в этом случае вам нужно записать во временный файл, а затем заменить оригинал.Таким образом, для достаточно маленьких файлов сделать это проще всего за один раз:

with open('./ampo.txt', 'r') as f:
    lines = f.readlines()
lines = ['EDF '+line for line in lines]
with open('./ampo.txt', 'w') as f:
    f.writelines(lines)
0 голосов
/ 03 октября 2011

Вот решение, в котором вы пишете временный файл и перемещаете его на место. Вы можете предпочесть эту версию, если файл, который вы переписываете, очень большой, поскольку он не позволяет хранить содержимое файла в памяти, как это делают версии с .read() или .readlines(). Кроме того, если при чтении или записи возникнут ошибки, ваш исходный файл будет в безопасности:

from shutil import move
from tempfile import NamedTemporaryFile

filename = './ampo.txt'
tmp = NamedTemporaryFile(delete=False)
with open(filename) as finput:
    with open(tmp.name, 'w') as ftmp:
        for line in finput:
            ftmp.write('EDF '+line)
move(tmp.name, filename)
0 голосов
/ 03 октября 2011

Для файла не слишком большого размера:

with open('./ampo.txt', 'rb+') as f:
    x = f.read()
    f.seek(0,0)
    f.writelines(('EDF ', x.replace('\n','\nEDF ')))
    f.truncate()

Обратите внимание, что в ТЕОРИИ, в ЭТОМ случае (контент дополнен), f.truncate() может быть не очень необходимым. Поскольку оператор with должен корректно закрывать файл, то есть писать EOF (конец файла) в конце перед закрытием.
Это то, что я наблюдал на примерах.
Но я осторожен: я думаю, что в любом случае лучше поставить эту инструкцию. Поскольку, когда содержимое уменьшается, оператор with не записывает EOF для правильного закрытия файла, который находится ниже, чем предыдущий начальный EOF, поэтому в файле остаются завершающие начальные символы.
Так что, если оператор with не записывает EOF, когда содержимое уменьшается, зачем его писать, когда содержимое увеличивается?

Для большого файла, чтобы не помещать все содержимое файла в ОЗУ сразу:

import os

def addsomething(filepath, ss):
    if filepath.rfind('.') > filepath.rfind(os.sep):
        a,_,c = filepath.rpartition('.')
        tempi = a + 'temp.' + c
    else:
        tempi = filepath + 'temp'

    with open(filepath, 'rb') as f, open(tempi,'wb') as g:
        g.writelines(ss + line for line in f)

    os.remove(filepath)
    os.rename(tempi,filepath)


addsomething('./ampo.txt','WZE')
0 голосов
/ 03 октября 2011
f = open('./ampo.txt', 'r')
lines = map(lambda l : 'EDF ' + l, f.readlines())
f.close()
f = open('./ampo.txt', 'w')
map(lambda l : f.write(l), lines)
f.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...