Як ви додаєте файл до Python?


1573

Як ви додаєте файл, а не перезаписуєте його? Чи є спеціальна функція, яка додається до файлу?

Відповіді:


2448
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.
Thomas Ahle

6
@Tom: ні. open()не жорсткий код utf-8. Він використовує locale.getpreferredencoding(False). Передайте encoding="utf-8"параметр явно, якщо знаєте, що у файлі використовується кодування utf-8.
jfs

206

Вам потрібно відкрити файл у режимі додавання, встановивши в якості режиму "а" або "ab". Дивіться відкритий () .

Коли ви відкриваєтесь в режимі "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 сторінка керівництва говорить:

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

fseek(stream, 0, SEEK_END);

Стара спрощена відповідь (не використовується with):

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

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

3
вам не потрібен close()?
Jonas Stein

9
@JonasStein, вам слід скористатися with- див. Docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement
sinelaw

використовуйте "test.txt", а не просто "тест", якщо ви пишете в текстовий файл у Windows.
ambassallo

Цікаво, коли мій файл закінчить писати в інший момент, але не в кінці файлу?
Ікра.

48

Я завжди це роблю,

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

Це просто, але дуже корисно.


12
трохи приємніше і трохи безпечніше писати: з open ('ім'я файлу', 'a') як f: f.write ('речі')
Сем Редвей

2
"a +" краще, ніж "a"
dell pk

6
Це менш просто, ніж більшість відповідей, розміщених за пару років до цього, і не корисніше
Тим

2
@Tim Castelijns Приємно, що хтось розмістив альтернативу синтаксису, який ви не завжди можете використовувати, якщо ви використовуєте змінну в декількох місцях.
болото

2
@marsh Навіть якщо ви передаєте fзмінну іншим функціям, та сама функція, що відкриває файл, повинна закрити її. withСинтаксис є кращим способом для досягнення цієї мети .
Ендрю Палмер

35

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

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

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


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 не існує, він буде створений ...


1
Це заслуговує більшої кількості результатів! Це найпростіший спосіб належного додавання кінців без додаткової логіки.
Перемислав Чеховський

Ви також можете встановити прапор WRITE_TO_FILE = open('my_file.txt', mode='a'), і тоді під час програми у вас може бути кілька відбитків print('Hello world', file=WRITE_TO_FILE), і кожен раз, коли ви вирішите побачити вихід на консолі, просто змініть прапор на WRITE_TO_FILE = None. Не забудьте закрити файл наприкінці, якщо його немаєNone
Алаа М.

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+У open(...)інструктує заяву , щоб відкрити файл в режимі додавання і дозволяє читання та запис.

Також завжди корисно використовувати file.close()для закриття будь-яких файлів, які ви відкрили, як тільки ви закінчите їх використання.


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

-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.