คุณผนวกไฟล์อย่างไรแทนที่จะเขียนทับมัน? มีฟังก์ชั่นพิเศษที่ผนวกเข้ากับไฟล์หรือไม่?
คุณผนวกไฟล์อย่างไรแทนที่จะเขียนทับมัน? มีฟังก์ชั่นพิเศษที่ผนวกเข้ากับไฟล์หรือไม่?
คำตอบ:
with open("test.txt", "a") as myfile:
myfile.write("appended text")
with open(file, "a")
วิธีนี้ ฉันอาจจะล้าสมัย แต่สิ่งที่ได้เปรียบคือopen(file, "a") ... file.close()
print("appended text", file=myfile)
ยังเป็นไปได้สำหรับ API ที่คุ้นเคยมากขึ้น
open()
ไม่ utf-8
hardcode locale.getpreferredencoding(False)
มันใช้ ส่งผ่านencoding="utf-8"
พารามิเตอร์อย่างชัดเจนหากทราบว่าไฟล์ใช้การเข้ารหัส utf-8
คุณต้องเปิดไฟล์ในโหมดต่อท้ายโดยการตั้งค่า "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'
close()
?
with
- ดูdocs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement
ฉันทำสิ่งนี้เสมอ
f = open('filename.txt', 'a')
f.write("stuff")
f.close()
มันง่าย แต่มีประโยชน์มาก
f
ตัวแปรไปยังฟังก์ชั่นอื่น ๆ ฟังก์ชั่นเดียวกันที่เปิดไฟล์ควรปิด with
ไวยากรณ์เป็นวิธีที่ต้องการที่จะบรรลุนี้
คุณอาจต้องการผ่าน"a"
เป็นอาร์กิวเมนต์โหมด ดูเอกสารสำหรับการเปิด ()
with open("foo", "a") as f:
f.write("cool beans...")
มีการเรียงสับเปลี่ยนของอาร์กิวเมนต์โหมดสำหรับการอัปเดต (+), การตัดทอน (w) และโหมดไบนารี (b) แต่เริ่มต้นด้วยเพียงแค่"a"
เป็นทางออกที่ดีที่สุดของคุณ
file
เงาฟังก์ชั่นในตัว อย่าใช้มันกับตัวแปร
file
ไม่มี builtin ในหลาม 3. แม้ในหลาม 2 นั้นจะถูกใช้น้อยมาก การเปิดไฟล์เป็นการดำเนินการทั่วไป มันก็โอเคที่จะใช้file
ชื่อที่นี่ทั้ง Python 2 และ 3 รู้ว่าเมื่อใดจะไม่สอดคล้องกัน
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
เมื่อเราใช้บรรทัดนี้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")
คุณสามารถทำได้ด้วยprint
แทนwrite
:
with open('test.txt', 'a') as f:
print('appended text', file=f)
หากไม่มีtest.txtก็จะถูกสร้างขึ้น ...
WRITE_TO_FILE = open('my_file.txt', mode='a')
และจากนั้นในช่วงโปรแกรมของคุณคุณสามารถมีพิมพ์หลายอย่างและเมื่อใดก็ตามที่คุณตัดสินใจที่จะเห็นผลลัพธ์ในคอนโซลเพียงแค่เปลี่ยนธงเพื่อprint('Hello world', file=WRITE_TO_FILE)
WRITE_TO_FILE = None
อย่าลืมปิดท้ายไฟล์ถ้าไม่ใช่None
คุณยังสามารถเปิดไฟล์ในr+
โหมดและจากนั้นตั้งตำแหน่งไฟล์เป็นจุดสิ้นสุดของไฟล์
import os
with open('text.txt', 'r+') as f:
f.seek(0, os.SEEK_END)
f.write("text to add")
การเปิดไฟล์ในr+
โหมดจะช่วยให้คุณเขียนไปยังตำแหน่งไฟล์อื่น ๆ นอกเหนือจากจุดสิ้นสุดในขณะที่a
และa+
บังคับให้เขียนไปยังจุดสิ้นสุด
หากคุณต้องการต่อท้ายไฟล์
with open("test.txt", "a") as myfile:
myfile.write("append me")
เราประกาศตัวแปรที่จะเปิดไฟล์ชื่อmyfile
test.txt
Open รับ 2 อาร์กิวเมนต์ไฟล์ที่เราต้องการเปิดและสตริงที่แสดงถึงประเภทของการอนุญาตหรือการดำเนินการที่เราต้องการทำกับไฟล์
นี่คือตัวเลือกโหมดไฟล์
คำอธิบายโหมด 'r' นี่คือโหมดเริ่มต้น มันเปิดไฟล์สำหรับการอ่าน 'w' โหมดนี้เปิดไฟล์สำหรับการเขียน หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์ใหม่ หากมีไฟล์อยู่จะตัดทอนไฟล์ 'x' สร้างไฟล์ใหม่ หากไฟล์มีอยู่แล้วการดำเนินการล้มเหลว 'a' เปิดไฟล์ในโหมดต่อท้าย หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์ใหม่ 't' นี่คือโหมดเริ่มต้น มันเปิดในโหมดข้อความ 'b' สิ่งนี้จะเปิดขึ้นในโหมดไบนารี '+' นี่จะเปิดไฟล์สำหรับอ่านและเขียน (อัปเดต)
'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+'
พารามิเตอร์ให้อิสระมากขึ้น โดยเฉพาะจะช่วยให้คุณสร้างไฟล์ได้หากไม่มีอยู่รวมถึงลบเนื้อหาของไฟล์ที่มีอยู่ในปัจจุบัน
วิธีที่ง่ายที่สุดในการต่อท้ายข้อความเพิ่มเติมถึงท้ายไฟล์คือการใช้:
with open('/path/to/file', 'a+') as file:
file.write("Additions to file")
file.close()
a+
ในopen(...)
สั่งคำสั่งให้เปิดไฟล์ในโหมดผนวกและช่วยให้การอ่านและการเข้าถึงการเขียน
นอกจากนี้ยังเป็นแนวปฏิบัติที่ดีที่จะใช้file.close()
เพื่อปิดไฟล์ใด ๆ ที่คุณเปิดไว้เมื่อคุณใช้งานเสร็จแล้ว
นี่คือสคริปต์ของฉันซึ่งโดยทั่วไปจะนับจำนวนบรรทัดแล้วต่อท้ายจากนั้นนับพวกเขาอีกครั้งเพื่อให้คุณมีหลักฐานการทำงาน
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()