เหตุใดฉันจึงไม่สามารถใช้สตริงสำหรับขึ้นบรรทัดใหม่ในการเขียน () แต่ฉันสามารถใช้ในการเขียน ()
ความคิดคือต่อไปนี้: write()
ถ้าคุณต้องการที่จะเขียนสายเดียวที่คุณสามารถทำเช่นนี้กับ writelines()
ถ้าคุณมีลำดับของสตริงที่คุณสามารถเขียนพวกเขาทั้งหมดที่ใช้
write(arg)
คาดว่าสตริงเป็นอาร์กิวเมนต์และเขียนลงในไฟล์ หากคุณระบุรายการสตริงจะทำให้เกิดข้อยกเว้น (โดยวิธีนี้แสดงข้อผิดพลาดให้เราทราบ!)
writelines(arg)
คาดว่าจะสามารถทำซ้ำได้เป็นอาร์กิวเมนต์ (อ็อบเจ็กต์ที่ทำซ้ำได้อาจเป็นทูเพิลรายการสตริงหรือตัววนซ้ำในความหมายทั่วไป) แต่ละรายการที่อยู่ในตัววนซ้ำคาดว่าจะเป็นสตริง Tuple ของสตริงคือสิ่งที่คุณให้มาสิ่งต่าง ๆ ก็ใช้ได้ผล
ลักษณะของสตริงไม่สำคัญกับทั้งสองฟังก์ชันกล่าวคือเพียงแค่เขียนไปยังไฟล์สิ่งที่คุณให้มา ส่วนที่น่าสนใจคือwritelines()
ไม่ได้เพิ่มอักขระขึ้นบรรทัดใหม่ด้วยตัวเองดังนั้นชื่อเมธอดอาจทำให้สับสนได้ write_all_of_these_strings(sequence)
มันจริงพฤติกรรมเช่นวิธีการที่เรียกว่าจินตนาการ
สิ่งต่อไปนี้เป็นวิธีสำนวนใน Python ในการเขียนรายการสตริงไปยังไฟล์ในขณะที่เก็บแต่ละสตริงไว้ในบรรทัดของตัวเอง:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
สิ่งนี้จะดูแลการปิดไฟล์ให้คุณ โครงสร้าง'\n'.join(lines)
เชื่อมต่อ (เชื่อมต่อ) สตริงในรายการlines
และใช้อักขระ '\ n' เป็นกาว มีประสิทธิภาพมากกว่าการใช้ตัว+
ดำเนินการ
เริ่มต้นจากlines
ลำดับเดียวกันลงท้ายด้วยเอาต์พุตเดียวกัน แต่ใช้writelines()
:
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
สิ่งนี้ใช้ประโยชน์จากนิพจน์ตัวสร้างและสร้างสตริงที่สิ้นสุดการขึ้นบรรทัดใหม่แบบไดนามิก writelines()
วนซ้ำตามลำดับของสตริงนี้และเขียนทุกรายการ
แก้ไข: อีกประเด็นที่คุณควรระวัง:
write()
และreadlines()
มีอยู่ก่อนwritelines()
ได้รับการแนะนำ writelines()
ได้รับการแนะนำในภายหลังเป็นคู่กันreadlines()
เพื่อให้สามารถเขียนเนื้อหาไฟล์ที่เพิ่งอ่านผ่านreadlines()
:
outfile.writelines(infile.readlines())
นี่เป็นสาเหตุหลักที่writelines
ทำให้ชื่อสับสนเช่นนี้ นอกจากนี้วันนี้เราไม่ต้องการใช้วิธีนี้อีกต่อไปแล้ว readlines()
อ่านไฟล์ทั้งหมดไปยังหน่วยความจำของเครื่องของคุณก่อนที่จะwritelines()
เริ่มเขียนข้อมูล ก่อนอื่นอาจเสียเวลา ทำไมไม่เริ่มเขียนบางส่วนของข้อมูลในขณะที่อ่านส่วนอื่น ๆ แต่ที่สำคัญที่สุดวิธีนี้สามารถใช้หน่วยความจำได้มาก ในสถานการณ์ที่รุนแรงซึ่งไฟล์อินพุตมีขนาดใหญ่กว่าหน่วยความจำของเครื่องวิธีนี้จะไม่ได้ผลด้วยซ้ำ วิธีแก้ปัญหานี้คือใช้ตัวทำซ้ำเท่านั้น ตัวอย่างการทำงาน:
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
สิ่งนี้อ่านไฟล์อินพุตทีละบรรทัด ทันทีที่อ่านหนึ่งบรรทัดบรรทัดนี้จะถูกเขียนไปยังไฟล์เอาต์พุต พูดตามแผนผังมักจะมีเพียงบรรทัดเดียวในหน่วยความจำ (เมื่อเทียบกับเนื้อหาไฟล์ทั้งหมดที่อยู่ในหน่วยความจำในกรณีของการอ่านบรรทัด / วิธีการเขียน)
lines
ไม่ใช่สตริงในตัวอย่างของคุณ เป็นทูเพิลประกอบด้วยหกสาย