คุณจะต่อท้ายไฟล์ใน Python อย่างไร?


1574

คุณผนวกไฟล์อย่างไรแทนที่จะเขียนทับมัน? มีฟังก์ชั่นพิเศษที่ผนวกเข้ากับไฟล์หรือไม่?

คำตอบ:


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

10
นี้จากการกวดวิชาอาจจะมีประโยชน์เช่นกัน
Dan

28
ฉันสังเกตเห็นว่าหลายคนใช้with open(file, "a")วิธีนี้ ฉันอาจจะล้าสมัย แต่สิ่งที่ได้เปรียบคือopen(file, "a") ... file.close()

75
bluewoodtree: ประโยชน์คล้ายกับของ RAII ใน C ++ หากคุณลืมปิด () อาจใช้เวลาสักครู่ก่อนที่ไฟล์จะถูกปิดจริง มันง่ายกว่าที่คุณอาจคิดว่าจะลืมมันเมื่อโค้ดมีจุดออกหลายจุดข้อยกเว้นและอื่น ๆ
Petter

54
print("appended text", file=myfile)ยังเป็นไปได้สำหรับ API ที่คุ้นเคยมากขึ้น
โทมัส Ahle

6
@Tom: ไม่ open()ไม่ utf-8hardcode locale.getpreferredencoding(False)มันใช้ ส่งผ่านencoding="utf-8"พารามิเตอร์อย่างชัดเจนหากทราบว่าไฟล์ใช้การเข้ารหัส utf-8
jfs

206

คุณต้องเปิดไฟล์ในโหมดต่อท้ายโดยการตั้งค่า "a" หรือ "ab" เป็นโหมด ดูเปิด ()

เมื่อคุณเปิดด้วยโหมด "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 manpageระบุ:

การเปิดไฟล์ในโหมดผนวก (a เป็นอักขระตัวแรกของโหมด) ทำให้การดำเนินการเขียนที่ตามมาทั้งหมดไปยังสตรีมนี้เกิดขึ้นที่ส่วนท้ายของไฟล์ราวกับว่าก่อนการโทร:

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" แทน "test" หากคุณกำลังเขียนลงในไฟล์ข้อความบน windows
ambassallo

ฉันสงสัยว่าไฟล์ของฉันจะเสร็จสิ้นการเขียนที่จุดอื่น แต่ไม่สิ้นสุดไฟล์หรือไม่
Iqra

49

ฉันทำสิ่งนี้เสมอ

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

มันง่าย แต่มีประโยชน์มาก


12
มันเล็กกว่าและค่อนข้างปลอดภัยกว่าในการเขียน: ด้วย open ('filename', 'a') ในรูปแบบ f: f.write ('stuff')
Sam Redway

2
"a +" ดีกว่า "a"
dell pk

6
ง่ายกว่าคำตอบส่วนใหญ่ที่โพสต์เมื่อสองสามปีก่อนหน้านี้และมันไม่มีประโยชน์มากกว่า
ทิม

2
@Tim Castelijns เป็นเรื่องดีที่มีคนโพสต์ทางเลือกแทนด้วยไวยากรณ์ที่คุณอาจไม่ต้องการใช้หากคุณใช้ตัวแปรในหลาย ๆ ที่
มาร์ช

2
@marsh แม้ว่าคุณจะผ่านfตัวแปรไปยังฟังก์ชั่นอื่น ๆ ฟังก์ชั่นเดียวกันที่เปิดไฟล์ควรปิด withไวยากรณ์เป็นวิธีที่ต้องการที่จะบรรลุนี้
Andrew Palmer

35

คุณอาจต้องการผ่าน"a"เป็นอาร์กิวเมนต์โหมด ดูเอกสารสำหรับการเปิด ()

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

มีการเรียงสับเปลี่ยนของอาร์กิวเมนต์โหมดสำหรับการอัปเดต (+), การตัดทอน (w) และโหมดไบนารี (b) แต่เริ่มต้นด้วยเพียงแค่"a"เป็นทางออกที่ดีที่สุดของคุณ


20
fileเงาฟังก์ชั่นในตัว อย่าใช้มันกับตัวแปร
Mark Tolonen

11
@MarkTolonen: fileไม่มี builtin ในหลาม 3. แม้ในหลาม 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
สิ่งนี้สมควรได้รับการโหวตมากขึ้น! นี่เป็นวิธีที่ง่ายที่สุดในการต่อท้ายบรรทัดสุดท้ายอย่างถูกต้องโดยไม่มีตรรกะเพิ่มเติม
Przemysław Czechowski

นอกจากนี้คุณยังสามารถมีธงWRITE_TO_FILE = open('my_file.txt', mode='a')และจากนั้นในช่วงโปรแกรมของคุณคุณสามารถมีพิมพ์หลายอย่างและเมื่อใดก็ตามที่คุณตัดสินใจที่จะเห็นผลลัพธ์ในคอนโซลเพียงแค่เปลี่ยนธงเพื่อprint('Hello world', file=WRITE_TO_FILE) WRITE_TO_FILE = Noneอย่าลืมปิดท้ายไฟล์ถ้าไม่ใช่None
Alaa M.

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.txtOpen รับ 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" จะถูกเรียกโดยอัตโนมัติที่ส่วนท้ายของบล็อก "with" ซึ่งเป็นข้อได้เปรียบของคำหลัก OP ถามเกี่ยวกับการเปิดไฟล์เพื่อต่อท้าย โหมด "+" ไม่จำเป็นเว้นแต่คุณจะต้องการอ่านเช่นกัน
Erik Knowles

-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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.