Как добавить в файл?

avatar
user502039
16 января 2011 в 16:20
1825406
13
1810

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

Источник

Ответы (13)

avatar
Petter
16 января 2011 в 16:24
2779
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Dan
29 июля 2011 в 22:44
13

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

Petter
13 июня 2013 в 17:37
88

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

Brian
23 июля 2020 в 18:49
11

Есть функциональная разница, помимо того, что просто не забыть закрыть. with открывает диспетчер контекста, который закроет файл, даже если есть ошибка между открытием и close().

Timo
25 января 2021 в 17:54
0

Можно легко сделать with open("test.txt") as myfile: myfile.write("appended text",'a'), но в открытом виде нужен.

pupsozeyde
6 июля 2021 в 09:48
0

@Timo TypeError: TextIOWrapper.write () принимает ровно один аргумент (2 задано)

avatar
Walt Howard
26 сентября 2020 в 19:38
1

Если несколько процессов записывают в файл , вы должны использовать режим добавления, иначе данные будут зашифрованы. В режиме добавления операционная система помещает каждую запись в конец файла независимо от того, где, по мнению автора, находится его позиция в файле. Это распространенная проблема для многопроцессорных сервисов, таких как nginx или apache, когда несколько экземпляров одного и того же процесса записывают в один и тот же журнал. файл. Подумайте, что произойдет, если вы попытаетесь искать, а затем напишите:

Example does not work well with multiple processes: 

f = open("logfile", "w"); f.seek(0, os.SEEK_END); f.write("data to write");

writer1: seek to end of file.           position 1000 (for example)
writer2: seek to end of file.           position 1000
writer2: write data at position 1000    end of file is now 1000 + length of data.
writer1: write data at position 1000    writer1's data overwrites writer2's data.

При использовании режима добавления операционная система помещает любую запись в конец файла.

f = open("logfile", "a"); f.seek(0, os.SEEK_END); f.write("data to write");

Большинство приложений , а не означает: «открыть файл, перейти к концу файла один раз после его открытия». Это означает: «открыть файл, каждая сделанная мной запись будет в конце файла».

ПРЕДУПРЕЖДЕНИЕ: чтобы это работало, вы должны записать всю свою запись за один раз, за ​​один вызов записи. Если вы разделите данные между несколькими записями, другие писатели могут и будут получать свои записи между вашими и искажать ваши данные.

avatar
Alaa M.
12 января 2020 в 11:58
19

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

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

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

avatar
mattc-7
12 декабря 2019 в 17:20
-1

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

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

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

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

Erik Knowles
23 марта 2020 в 19:56
6

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

avatar
Alec
25 мая 2019 в 03:48
6

Параметр '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

avatar
Primusa
8 февраля 2019 в 00:23
7

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

import os

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

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

avatar
nima moradi
20 декабря 2018 в 05:39
5

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

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

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

вот параметры режима файла

Mode    Description

'r' This is the default mode. It Opens file for reading.
'w' This Mode Opens file for writing. 
If file does not exist, it creates a new file.
If file exists it truncates the file.
'x' Creates a new file. If file already exists, the operation fails.
'a' Open file in append mode. 
If file does not exist, it creates a new file.
't' This is the default mode. It opens in text mode.
'b' This opens in binary mode.
'+' This will open a file for reading and writing (updating)
avatar
Cleve Green
27 октября 2017 в 17:27
45

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
avatar
K.Suthagar
29 декабря 2016 в 15:51
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")
avatar
travelingbones
31 августа 2016 в 22:19
-9

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

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()
avatar
Seth Connell
9 ноября 2014 в 20:57
53

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

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

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

Sam Redway
2 февраля 2015 в 22:00
18

его немного лучше и немного безопаснее писать: с open ('filename', 'a') как f: f.write ('stuff')

avatar
istruble
16 января 2011 в 16:31
38

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

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

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

Mark Tolonen
16 января 2011 в 16:50
21

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

jfs
29 декабря 2014 в 02:12
14

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

avatar
sinelaw
16 января 2011 в 16:23
233

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

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

Пример:

>>> 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' гарантирует, что все ваши последующие записи будут добавлены атомарно в конец файла (даже если файл увеличивается за счет других операций записи).


Еще несколько подробностей о том, как работает режим "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 справочная страница утверждает:

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

fseek(stream, 0, SEEK_END);

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

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

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