สับสนโดยโหมดไฟล์หลาม“ w +”


203

จากdoc ,

โหมด 'r +', 'w +' และ 'a +' เปิดไฟล์สำหรับการอัปเดต (โปรดทราบว่า 'w +' จะตัดทอนไฟล์) ผนวก 'b' เข้ากับโหมดเพื่อเปิดไฟล์ในโหมดไบนารีบนระบบที่แยกความแตกต่างระหว่างไฟล์ไบนารีและไฟล์ข้อความ บนระบบที่ไม่มีความแตกต่างนี้การเพิ่ม 'b' จะไม่มีผลใด ๆ

และที่นี่

w +: เปิดไฟล์สำหรับทั้งการเขียนและการอ่าน เขียนทับไฟล์ที่มีอยู่หากไฟล์นั้นมีอยู่ หากไฟล์ไม่มีอยู่ให้สร้างไฟล์ใหม่สำหรับการอ่านและการเขียน

แต่จะอ่านไฟล์ที่เปิดด้วยได้w+อย่างไร?


27
ฉันพบว่าแผนภาพนี้มีประโยชน์มาก
Ritwik

คำตอบ:


133

สมมติว่าคุณกำลังเปิดไฟล์ด้วยwithคำสั่งอย่างที่คุณควรจะเป็น จากนั้นคุณจะทำสิ่งนี้เพื่ออ่านจากไฟล์ของคุณ:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

หมายเหตุf.seek(0)- ถ้าคุณลืมสิ่งนี้การf.read()โทรจะพยายามอ่านจากจุดสิ้นสุดของไฟล์และจะส่งคืนสตริงว่าง


1
"การตัดเหลือ 0 ไบต์" หมายความว่าอะไร
Nasif Imtiaz Ohi

22
@NasifImtiazOhi - เอกสาร Python บอกว่าw+จะ "เขียนทับไฟล์ที่มีอยู่หากไฟล์นั้นมีอยู่" ดังนั้นทันทีที่คุณเปิดไฟล์ด้วยw+ตอนนี้มันจะเป็นไฟล์เปล่า: มันมี 0 ไบต์ ถ้ามันใช้เพื่อให้มีข้อมูลข้อมูลที่ได้รับการตัดทอน - ตัดออกและโยนทิ้งไป - และตอนนี้ขนาดไฟล์เป็น 0 ไบต์ดังนั้นคุณจึงไม่สามารถอ่านข้อมูลใด ๆ ที่มีอยู่ก่อนที่w+คุณเปิดไฟล์ที่มี หากคุณต้องการจริงในการอ่านข้อมูลก่อนหน้าและเพิ่มไปคุณควรใช้แทนr+ w+
rmunn

จะเพิ่มข้อมูลใหม่ได้อย่างไร
Beqa Bukhradze

1
@BeqaBukhradze - หากคุณมีคำถามให้คลิกปุ่ม "ถามคำถาม" ซึ่งจะมีคนหลายร้อยคนมองเห็น อย่าเพียงคลิกปุ่ม "เพิ่มความคิดเห็น" ที่มีเพียงหนึ่งหรือสองคนเท่านั้นที่จะเห็น
rmunn

434

นี่คือรายการโหมดต่างๆของการเปิดไฟล์:

  • R

    เปิดไฟล์เพื่ออ่านเท่านั้น ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์ นี่คือโหมดเริ่มต้น

  • RB

    เปิดไฟล์เพื่ออ่านในรูปแบบไบนารีเท่านั้น ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์ นี่คือโหมดเริ่มต้น

  • R +

    เปิดไฟล์สำหรับทั้งการอ่านและการเขียน ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์

  • RB +

    เปิดไฟล์สำหรับทั้งการอ่านและการเขียนในรูปแบบไบนารี ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์

  • W

    เปิดไฟล์เพื่อเขียนเท่านั้น เขียนทับไฟล์หากไฟล์นั้นมีอยู่ หากไฟล์ไม่มีอยู่ให้สร้างไฟล์ใหม่สำหรับการเขียน

  • wb

    เปิดไฟล์สำหรับการเขียนในรูปแบบไบนารีเท่านั้น เขียนทับไฟล์หากไฟล์นั้นมีอยู่ หากไฟล์ไม่มีอยู่ให้สร้างไฟล์ใหม่สำหรับการเขียน

  • W +

    เปิดไฟล์สำหรับทั้งการเขียนและการอ่าน เขียนทับไฟล์ที่มีอยู่หากไฟล์นั้นมีอยู่ หากไฟล์ไม่มีอยู่ให้สร้างไฟล์ใหม่สำหรับการอ่านและการเขียน

  • wb +

    เปิดไฟล์สำหรับทั้งการเขียนและการอ่านในรูปแบบไบนารี เขียนทับไฟล์ที่มีอยู่หากไฟล์นั้นมีอยู่ หากไฟล์ไม่มีอยู่ให้สร้างไฟล์ใหม่สำหรับการอ่านและการเขียน

  • a

    เปิดไฟล์เพื่อต่อท้าย ตัวชี้ไฟล์อยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ นั่นคือไฟล์อยู่ในโหมดผนวก หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์ใหม่สำหรับการเขียน

  • AB

    เปิดไฟล์สำหรับต่อท้ายในรูปแบบไบนารี ตัวชี้ไฟล์อยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ นั่นคือไฟล์อยู่ในโหมดผนวก หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์ใหม่สำหรับการเขียน

  • A +

    เปิดไฟล์สำหรับการต่อท้ายและการอ่าน ตัวชี้ไฟล์อยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ ไฟล์จะเปิดขึ้นในโหมดต่อท้าย หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์ใหม่สำหรับการอ่านและการเขียน

  • AB +

    เปิดไฟล์สำหรับการต่อท้ายและการอ่านในรูปแบบไบนารี ตัวชี้ไฟล์อยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ ไฟล์จะเปิดขึ้นในโหมดต่อท้าย หากไฟล์ไม่มีอยู่มันจะสร้างไฟล์ใหม่สำหรับการอ่านและการเขียน


22
@Humdinger: ไม่w+สร้างไฟล์ใหม่หรือตัดทอนไฟล์ที่มีอยู่จากนั้นเปิดขึ้นมาเพื่ออ่านและเขียน r+เปิดไฟล์ที่มีอยู่โดยไม่ต้องตัดทอนเพื่ออ่านและเขียน แตกต่างกันมาก
abarnert

1
นอกจากนี้เช่นเดียวกับคำตอบของ @ AlokAgarwal สิ่งนี้อ้างว่าเป็นรายการที่สมบูรณ์ของโหมด แต่ไม่ใช่
abarnert

1
มันค่อนข้างงี่เง่าที่จะให้รายการโหมดที่ละเอียดถี่ถ้วนเนื่องจากมันทำงานเหมือนกับฟังก์ชันที่มีพารามิเตอร์หลายตัว r, wหรือaเป็นเอกสิทธิ์ แต่bสามารถเพิ่มเข้าไปในสิ่งใดก็ได้ที่สามารถทำได้+หรือU... เป็นการระเบิดแบบ combinatorial
rmunn

4
rbไม่ใช่โหมดเริ่มต้นอ้างจาก: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy

1
บางทีเราสามารถเพิ่มโหมด "x" หรือ "การสร้างแบบเอกสิทธิ์" ซึ่งจะเป็นการสร้างไฟล์ (สำหรับการเขียน) หากไม่มีอยู่และเพิ่ม FileExistsError หากไม่มี
กล่องเสียง Decidua

158

โหมดไฟล์ทั้งหมดใน Python

  • r สำหรับการอ่าน
  • r+ เปิดสำหรับการอ่านและการเขียน (ไม่สามารถตัดไฟล์)
  • w สำหรับการเขียน
  • w+ สำหรับการเขียนและอ่าน (สามารถตัดไฟล์)
  • rbสำหรับการอ่านไฟล์ไบนารี ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์
  • rb+ การอ่านหรือเขียนไฟล์ไบนารี
  • wb+ เขียนไฟล์ไบนารี
  • a+ เปิดสำหรับการต่อท้าย
  • ab+เปิดไฟล์สำหรับการต่อท้ายและการอ่านในรูปแบบไบนารี ตัวชี้ไฟล์อยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ ไฟล์จะเปิดขึ้นในโหมดต่อท้าย
  • x เปิดสำหรับการสร้างแบบเอกสิทธิ์เฉพาะบุคคลล้มเหลวหากไฟล์มีอยู่แล้ว (Python 3)

5
นี่ไม่ใช่โหมดทั้งหมด มันละเลยเช่นrbและwbไม่ต้องพูดถึงUโหมดใน 2.x และtโหมดใน 3.x (ซึ่งทั้งสองสามารถรวมกับทุกอย่างยกเว้นb)
abarnert

1
ความแตกต่างระหว่าง r + และ w + คือ w + ตัดทอนไฟล์เมื่อเปิด แต่คุณสามารถตัดมันด้วยตนเองในทั้งสองโหมด
Martin

1
คำตอบนี้ไม่สอดคล้องกับคำตอบที่ได้รับจาก @ 200 OK เช่นwb+อ่านจากไฟล์ด้วยหรือไม่
Celeritas

@Celeritas wb ระบุว่าไฟล์ถูกเปิดสำหรับการเขียนในโหมดไบนารี สำหรับระบบ Unix (Linux, Mac OS X และอื่น ๆ ) โหมดไบนารีไม่ได้ทำอะไรเลย - พวกมันจัดการกับไฟล์ข้อความเช่นเดียวกับที่ไฟล์อื่น ๆ ได้รับการปฏิบัติ อย่างไรก็ตามใน Windows ไฟล์ข้อความถูกเขียนด้วยการสิ้นสุดบรรทัดที่แก้ไขเล็กน้อย สิ่งนี้ทำให้เกิดปัญหาร้ายแรงเมื่อจัดการกับไฟล์ไบนารีจริงเช่นไฟล์ exe หรือ jpg ดังนั้นเมื่อเปิดไฟล์ที่ไม่ควรเป็นข้อความแม้แต่ Unix คุณควรใช้ wb หรือ rb ใช้ w หรือ r ล้วนสำหรับไฟล์ข้อความเท่านั้น
Alok Agarwal

ใน Python 3 นอกจากนี้ยังมีโหมดเปิด 'x': เปิดสำหรับการสร้างแบบเอกสิทธิ์เฉพาะบุคคลซึ่งล้มเหลวหากไฟล์มีอยู่แล้ว ดูฟังก์ชั่นเปิดในเอกสาร
Laurent LAPORTE

9

r สำหรับการอ่าน

w สำหรับการเขียน

r+ สำหรับการอ่าน / เขียนโดยไม่ต้องลบเนื้อหาต้นฉบับหากมีไฟล์อยู่มิฉะนั้นจะทำให้เกิดข้อยกเว้น

w+ เพื่อลบเนื้อหาต้นฉบับจากนั้นอ่าน / เขียนหากมีไฟล์อยู่มิฉะนั้นให้สร้างไฟล์

ตัวอย่างเช่น,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

ไฟล์ถูกตัดทอนดังนั้นคุณสามารถโทรได้read()(ไม่มีข้อยกเว้นใด ๆ ซึ่งแตกต่างจากเมื่อเปิดโดยใช้ 'w') แต่คุณจะได้รับสตริงว่าง


2

ฉันสงสัยว่ามีสองวิธีในการจัดการกับสิ่งที่ฉันคิดว่าคุณกำลังพยายามที่จะบรรลุ

1) ซึ่งเห็นได้ชัดคือเปิดไฟล์สำหรับอ่านอย่างเดียวอ่านลงในหน่วยความจำแล้วเปิดไฟล์ด้วย t แล้วเขียนการเปลี่ยนแปลงของคุณ

2) ใช้รูทีนการจัดการไฟล์ระดับต่ำ:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

หวังว่านี่จะช่วย ..


ถ้าอย่างนั้นจะทำอะไร r+
SmartManoj

1

อันที่จริงมีบางอย่างผิดปกติเกี่ยวกับคำตอบอื่น ๆ ทั้งหมดเกี่ยวกับr+โหมด

test.in เนื้อหาของไฟล์:

hello1
ok2
byebye3

และสคริปต์ของ py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

ดำเนินการและtest.inเนื้อหาของจะถูกเปลี่ยนเป็น:

hello1
ok2
byebye3
addition

อย่างไรก็ตามเมื่อเราแก้ไขสคริปต์เป็น:

with open("test.in", 'r+')as f:
    f.write("addition")

test.inยังทำตอบสนองต่อไปนี้:

additionk2
byebye3

ดังนั้นr+โหมดนี้จะช่วยให้เราสามารถครอบคลุมเนื้อหาตั้งแต่ต้นถ้าเราไม่ได้ทำการอ่าน และถ้าเราทำการอ่านบางอย่างf.write()เพียงแค่ต่อท้ายไฟล์

โดยวิธีการถ้าเราf.seek(0,0)ก่อนหน้าf.write(write_content)นี้ write_content จะครอบคลุมพวกเขาจากตำแหน่ง (0,0)


0

ตามที่กล่าวไว้โดยh4z3สำหรับการใช้งานจริงบางครั้งข้อมูลของคุณใหญ่เกินไปที่จะโหลดทุกอย่างโดยตรงหรือคุณมีเครื่องกำเนิดไฟฟ้าหรือข้อมูลขาเข้าตามเวลาจริงคุณสามารถใช้ w + เพื่อเก็บไว้ในไฟล์และอ่านในภายหลัง

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