Как вы добавляете файл в Python?


1574

Как вы добавляете файл вместо того, чтобы перезаписывать его? Есть ли специальная функция, которая добавляет в файл?

Ответы:


2449
with open("test.txt", "a") as myfile:
    myfile.write("appended text")

10
Это из учебника может быть полезным.
Дан

28
Я заметил, что многие люди используют этот with open(file, "a")метод. Я , может быть старомодным, но то , что является преимуществом по сравнениюopen(file, "a") ... file.close()

75
bluewoodtree: Преимущества аналогичны RAII в C ++. Если вы забудете close (), может пройти некоторое время, прежде чем файл будет фактически закрыт. Проще подумать о том, чтобы забыть об этом, когда код имеет несколько точек выхода, исключений и так далее.
Петтер

54
print("appended text", file=myfile)Также возможно, для более знакомого API.
Томас Ахле

206

Вам нужно открыть файл в режиме добавления, установив «a» или «ab» в качестве режима. Смотри open () .

Когда вы открываете в режиме «а», позиция записи всегда будет в конце файла (добавление). Вы можете открыть с «+», чтобы разрешить чтение, поиск назад и чтение (но все записи все равно будут в конце файла!).

Пример:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

Примечание . Использование «a» - это не то же самое, что открытие с «w» и поиск в конце файла - подумайте, что может произойти, если другая программа откроет файл и начнет запись между поиском и записью. В некоторых операционных системах открытие файла с помощью «a» гарантирует, что все последующие записи будут добавлены атомарно в конец файла (даже если файл увеличивается за счет других записей).


Еще несколько подробностей о том, как работает режим «а» ( протестировано только в Linux ). Даже если вы ищете ответ, каждая запись будет добавлена ​​в конец файла:

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

На самом деле, fopen страница руководства гласит:

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

fseek(stream, 0, SEEK_END);

Старый упрощенный ответ (не используется with):

Пример: ( в реальной программе используйте, withчтобы закрыть файл - см. Документацию )

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'

49

Я всегда так делаю,

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

Это просто, но очень полезно.


12
его немного приятнее и немного безопаснее писать: с open ('filename', 'a') как f: f.write ('stuff')
Сэм Редуэй

35

Вы, вероятно, хотите передать "a"в качестве аргумента режима. Смотрите документы для open () .

with open("foo", "a") as f:
    f.write("cool beans...")

Существуют и другие варианты аргумента mode для обновления (+), усечения (w) и бинарного (b) режима, но "a"лучше всего начинать с just .


20
fileЗатеняет встроенную функцию. Не используйте это для переменных.
Марк Толонен

11
@MarkTolonen: fileбольше не является встроенным в Python 3. Даже в Python 2 он используется очень редко . Открытие файла является обычной операцией. Можно использовать fileимя здесь и на Python 2, и на 3. Знайте, когда нужно быть непоследовательным.
JFS

34

В Python есть много вариантов основных трех режимов, эти три режима:

'w'   write text
'r'   read text
'a'   append text

Чтобы добавить в файл это так же просто, как:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Тогда есть режимы, которые просто делают ваш код меньше строк:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Наконец, существуют режимы чтения / записи в двоичном формате:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary

14

когда мы используем эту строку open(filename, "a"), это aуказывает на добавление файла, это означает, что позволяет вставлять дополнительные данные в существующий файл.

Вы можете просто использовать следующие строки, чтобы добавить текст в ваш файл

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")

9

Вы также можете сделать это printвместо write:

with open('test.txt', 'a') as f:
    print('appended text', file=f)

Если test.txt не существует, он будет создан ...


6

Вы также можете открыть файл в r+режиме, а затем установить положение файла в конец файла.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Открытие файла в r+режиме позволит вам записать в другие позиции файла, кроме конца, aи a+принудительно записать в конец.


4

если вы хотите добавить в файл

with open("test.txt", "a") as myfile:
    myfile.write("append me")

Мы объявили переменную, myfileчтобы открыть файл с именем test.txt. Open принимает 2 аргумента: файл, который мы хотим открыть, и строку, представляющую виды разрешений или операций, которые мы хотим выполнить над файлом

здесь есть параметры режима файла

Описание режима

'r' Это режим по умолчанию. Открывает файл для чтения.
'w' Этот режим открывает файл для записи. 
Если файл не существует, он создает новый файл.
Если файл существует, он усекает файл.
'x' Создает новый файл. Если файл уже существует, операция не выполняется.
'a' Открыть файл в режиме добавления. 
Если файл не существует, он создает новый файл.
't' Это режим по умолчанию. Он открывается в текстовом режиме.
'b' Это открывается в двоичном режиме.
'+' Это откроет файл для чтения и записи (обновление)

4

В 'a'Значит параметров режима добавления. Если вы не хотите использовать with openкаждый раз, вы можете легко написать функцию, которая сделает это за вас:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

Если вы хотите написать в другом месте, кроме конца, вы можете использовать 'r+' :

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Наконец, 'w+'параметр предоставляет еще больше свободы. В частности, он позволяет вам создать файл, если он не существует, а также очистить содержимое файла, который существует в настоящее время.


Кредит на эту функцию идет на @Primusa


2

Самый простой способ добавить больше текста в конец файла - использовать:

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

Оператор a+in open(...)указывает открыть файл в режиме добавления и разрешить чтение и запись.

Также всегда полезно использовать file.close()для закрытия любых файлов, которые вы открыли, как только вы закончите с ними.


1
«file.close» автоматически вызывается в конце блока «with», что является преимуществом ключевого слова. Также ОП попросил открыть файл для добавления. Режим «+» не требуется, если вы не хотите читать.
Эрик Ноулз

-6

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

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.