Как вставить новую строку перед первой строкой в ​​файле, используя python? - PullRequest
2 голосов
/ 13 марта 2011

подробнее ниже:

1st line

2nd line

3rd line

4th line

...

Теперь хотите вставить новую строку с именем zero line перед 1st line. Файл выглядит следующим образом:

zero line

1st line

2nd line

3rd line

4th line

...

Я знаю, что sed команда может сделать эту работу, но как это сделать с помощью Python? Спасибо

Ответы [ 4 ]

6 голосов
/ 13 марта 2011

вы можете использовать fileinput

>>> import fileinput
>>> for linenum,line in enumerate( fileinput.FileInput("file",inplace=1) ):
...   if linenum==0 :
...     print "new line"
...     print line.rstrip()
...   else:
...     print line.rstrip()
...
4 голосов
/ 13 марта 2011

это может представлять интерес

http://net4geeks.com/index.php?option=com_content&task=view&id=53&Itemid=11

адаптировано к вашему вопросу:

# read the current contents of the file
f = open('filename')
text = f.read()
f.close()
# open the file again for writing
f = open('filename', 'w')
f.write("zero line\n\n")
# write the original contents
f.write(text)
f.close()
  • Откройте файл и прочитайте содержимоев «текст».

  • Закрыть файл

  • Повторно открыть файл с аргументом 'w' для записи

  • Записьтекст перед файлом

  • Записать исходное содержимое файла в файл

  • Закрыть файл

Прочитайте предупреждения в ссылке.

edit:

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

3 голосов
/ 13 марта 2011

Вот реализация, которая исправляет некоторые недостатки других представленных подходов:

Имитирует обработку ошибок fileinput:

import os

def prepend(filename, data, bufsize=1<<15):
    # backup the file
    backupname = filename + os.extsep+'bak'
    try: os.unlink(backupname) # remove previous backup if it exists
    except OSError: pass
    os.rename(filename, backupname)

    # open input/output files,  note: outputfile's permissions lost
    with open(backupname) as inputfile, open(filename, 'w') as outputfile:
        # prepend
        outputfile.write(data)
        # copy the rest
        buf = inputfile.read(bufsize)
        while buf:
            outputfile.write(buf)
            buf = inputfile.read(bufsize)

    # remove backup on success
    try: os.unlink(backupname)
    except OSError: pass

prepend('file', '0 line\n')

Вы можете использовать утилиту cat, если она доступна для копирования файлов. Это может быть более эффективным:

import os
from subprocess import PIPE, Popen

def prepend_cat(filename, data, bufsize=1<<15):
    # backup the file
    backupname = filename + os.extsep+'bak'
    try: os.unlink(backupname)
    except OSError: pass
    os.rename(filename, backupname)

    # $ echo $data | cat - $backupname > $filename
    with open(filename, 'w') as outputfile: #note: outputfile's permissions lost
        p = Popen(['cat', '-', backupname], stdin=PIPE, stdout=outputfile)
        p.communicate(data)

    # remove backup on success
    if p.poll() == 0:
        try: os.unlink(backupname)
        except OSError: pass

prepend_cat('file', '0 line\n')
0 голосов
/ 13 марта 2011

код

L = list()
f = open('text2.txt', 'r')
for line in f.readlines():
        L.append(line)
L.insert(0,"Zero\n")
f.close()

fi = open('text2.txt', 'w')
for line in xrange(len(L)):
        fi.write(L[line])

fi.close()

text2.txt

Hello
The second line
3
4
5
6

выход

Zero
Hello
The second line
3
4
5
6

Однако для больших файлов это может занимать много памяти и занимать много времени.

Если вы беспокоитесь о чем-то вроде 31-й строки, я бы просто сделал мод% 10 для числа, чтобы получить более точную версию.

Дайте мне знать, если это поможет, или если вы хотите лучшую версию. Кроме того, если вы хотите лучшего форматирования, посмотрите на ljust и rjust для left и right justify.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...