วิธีการเปิดไฟล์สำหรับการอ่านและการเขียน?


211

มีวิธีการเปิดไฟล์สำหรับการอ่านและการเขียนหรือไม่?

เพื่อแก้ไขปัญหาฉันเปิดไฟล์เพื่อเขียนปิดแล้วเปิดอีกครั้งเพื่ออ่าน แต่มีวิธีเปิดไฟล์สำหรับทั้งการอ่านและการเขียนหรือไม่?


3
คุณกำลังแก้ไขปัญหาอะไร อาจจะมีวิธีแก้ปัญหาที่ดีกว่าการเขียน / อ่านไฟล์เช่นmmap
Roman Bodnarchuk

1
คุณกรุณาให้รหัสแก่เราเพื่อที่เราจะสามารถตอบคุณได้ นอกจากนี้คุณยังสามารถลองมาดู: docs.python.org/tutorial/... อย่างไรก็ตามฉันได้ลองใช้ r + b และใช้งานได้แล้ว นอกจากนี้ยังมีประโยชน์ในการใช้ file descriptor หนึ่งฟังก์ชันในฟังก์ชั่น diff หรือไม่?
Artsiom Rudzenka

@RomanBodnarchuk mmapเป็นความคิดที่ดี แต่ถ้าคุณต้องจัดการกับการเห็นพ้องด้วย? มีวิธีสำรองการเข้าถึงหรือไม่?
Dr_Zaszuś

คำตอบ:


267

นี่คือวิธีที่คุณอ่านไฟล์แล้วเขียนลงไป (เขียนทับข้อมูลที่มีอยู่ใด ๆ ) โดยไม่ต้องปิดและเปิดใหม่:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
ใช้a+เพื่อปกปิดตัวพิมพ์ใหญ่ - ท้ายว่าไฟล์นั้นไม่มีอยู่ (จะถูกสร้างขึ้น)
Jossef Harush

16
แสวงหา () และตัดทอน () ทั้งคู่มีความสำคัญ!
smwikipedia

4
@JossefHarush โปรดทราบว่าเอกสารสำหรับaรัฐ 'ในระบบ Unix บางระบบหมายความว่าทุกการเขียนผนวกท้ายไฟล์โดยไม่คำนึงถึงตำแหน่งการค้นหาปัจจุบัน' ในกรณีนี้f.seek(0)จะไม่ทำงานตามที่คาดไว้ ฉันเพิ่งทำผิดพลาดนี้บน Linux
แกรม

6
เป็นการดีกว่าที่คุณจะอธิบายว่าทำไมseekและtruncateใช้ที่นี่ ผู้อ่านส่วนใหญ่มาจาก google และคัดลอกวาง
Shiplu Mokaddim

8
หลังจากคุณอ่านไฟล์แล้วตัวชี้ไฟล์ (fp) ได้ย้ายไปข้างหน้าดังนั้นคุณต้องตั้งค่าให้เริ่มต้น นั่นคือseek(0): มันวาง fp เพื่อตำแหน่ง0( เช่นจุดเริ่มต้น) truncate()ตัดไฟล์เป็นจำนวนไบต์ที่ระบุเช่นลบเนื้อหาไฟล์ทั้งหมดหลังจากจำนวนไบต์ที่ระบุ ลองนึกภาพว่าไฟล์ของคุณมีสตริงและคุณเขียนHello, world Byeหากคุณไม่ได้truncate()เนื้อหาในตอนท้ายจะเป็นByelo, worldเพราะคุณไม่เคยลบข้อความที่มีอยู่ในไฟล์ truncate()ตัดไฟล์เป็น fp ปัจจุบัน
Illya Gerasymchuk

48

r+เป็นโหมดมาตรฐานสำหรับการอ่านและการเขียนในเวลาเดียวกัน สิ่งนี้ไม่แตกต่างจากการใช้การfopen()เรียกของระบบเนื่องจากfile()/ open()เป็นเพียง wrapper เล็ก ๆ รอบการเรียกระบบปฏิบัติการนี้


มันผนวกเนื้อหาไฟล์ไม่ได้เขียนตั้งแต่เริ่มต้น
TomSawyer

47

สรุปพฤติกรรม I / O

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

และสาขาการตัดสินใจ

ป้อนคำอธิบายรูปภาพที่นี่


คุณใช้ซอฟต์แวร์ใดในการทำแผนภูมิต้นไม้
ฟลักซ์

ฉันก็จะสนใจเช่นกัน - Dia?
nerdoc

22

ฉันได้ลองสิ่งนี้แล้วใช้งานได้ตามที่คาดไว้:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

ที่ไหน:

f.read (ขนาด) - หากต้องการอ่านเนื้อหาของไฟล์โทร f.read (ขนาด) ซึ่งอ่านปริมาณข้อมูลบางส่วนแล้วส่งกลับเป็นสตริง

และ:

f.write (สตริง) เขียนเนื้อหาของสตริงลงในไฟล์โดยคืนค่า None

นอกจากนี้หากคุณเปิดบทช่วยสอน Python เกี่ยวกับการอ่านและการเขียนไฟล์คุณจะพบว่า:

'r +' เปิดไฟล์สำหรับการอ่านและการเขียน

บน Windows 'b' ต่อท้ายโหมดจะเปิดไฟล์ในโหมดไบนารีดังนั้นจึงมีโหมดเช่น 'rb', 'wb' และ 'r + b'


5
การอ่านแล้วการเขียนก็ใช้งานได้ดีพอ ๆ กันโดยใช้โหมด 'r + b' แต่คุณต้องใช้ f.seek (0) ระหว่าง f.read () และ f.write () เพื่อวางเคอร์เซอร์ไว้ที่จุดเริ่มต้นของไฟล์
gaborous

2
โปรดทราบว่าหากข้อมูลที่คุณเขียนไม่ได้เป็นข้อมูลที่มีอยู่แล้วอีกต่อไปข้อมูลนั้นจะไม่ถูกตัดทอน ใช้truncateวิธีการนี้
Flimm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.