Как вы добавляете файл в Python? - PullRequest
1375 голосов
/ 16 января 2011

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

Ответы [ 10 ]

2157 голосов
/ 16 января 2011
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
177 голосов
/ 16 января 2011

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

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


Несколькоподробнее о том, как работает режим «а» ( протестировано только в 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 manpage сообщает:

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

fseek(stream, 0, SEEK_END);

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

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

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
40 голосов
/ 09 ноября 2014

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

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

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

33 голосов
/ 16 января 2011

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

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

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

26 голосов
/ 27 октября 2017

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
12 голосов
/ 29 декабря 2016

когда мы используем эту строку 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")
2 голосов
/ 08 февраля 2019

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

import os

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

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

1 голос
/ 25 мая 2019

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

1 голос
/ 20 декабря 2018

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

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)
0 голосов
/ 01 сентября 2016

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...