อ่านเฉพาะบรรทัดแรกของไฟล์?


208

คุณจะได้รับเฉพาะบรรทัดแรกของไฟล์เป็นสตริงด้วย Python อย่างไร


4
หากคุณอ่านไฟล์ ("หลังจากอ่านไฟล์") คุณจะอ่านบรรทัดแรกแล้ว! (สมมติว่ามีอย่างน้อยหนึ่งบรรทัด.)
วิลเลียม Pursell

3
โปรดทราบว่าคำถามที่เป็นคำพูดในขณะนี้มีความหมายที่แตกต่างไปจากเดิม บางคำตอบตอนนี้ดูโง่ ๆ เพราะพวกเขาคำนึงถึงส่วน "หลังจากอ่านในไฟล์" (ซึ่งถูกลบ)
Peter Hansen

คำตอบ:


354

ใช้.readline()วิธีการ ( Python 2 เอกสาร , Python 3 เอกสาร ):

with open('myfile.txt') as f:
    first_line = f.readline()

หมายเหตุบางส่วน:

  1. ดังที่ระบุไว้ในเอกสารเว้นแต่จะเป็นบรรทัดเดียวในไฟล์สตริงที่ส่งคืนจากf.readline()จะมีบรรทัดใหม่ต่อท้าย คุณอาจต้องการใช้f.readline().strip()แทนการขึ้นบรรทัดใหม่
  2. withคำสั่งโดยอัตโนมัติปิดไฟล์อีกครั้งเมื่อปลายบล็อก
  3. withคำสั่งใช้งานได้เฉพาะในหลาม 2.5 ขึ้นไปและในหลาม 2.5 คุณจำเป็นต้องใช้from __future__ import with_statement
  4. ใน Python 3 คุณควรระบุการเข้ารหัสไฟล์สำหรับไฟล์ที่คุณเปิด อ่านเพิ่มเติม...

3
ใน Python 3 ถ้าไฟล์เป็น ascii หรือ utf8 คุณไม่จำเป็นต้องระบุการเข้ารหัสไฟล์ และหากไม่ใช่คุณควรระบุการเข้ารหัสเป็น codecs.open ใน Python 2 ต่อไป
Evpok

2
@Evpok "ใน Python 3 ถ้าไฟล์เป็น ascii หรือ utf8 คุณไม่จำเป็นต้องระบุการเข้ารหัสไฟล์" - ถ้ามันเป็นจริงอย่างเคร่งครัด! ความจริงจะยุ่งกว่าเล็กน้อย ตามที่ระบุไว้ในเอกสารการเข้ารหัสเริ่มต้นที่ใช้ขึ้นอยู่กับแพลตฟอร์ม (และอาจแตกต่างกันแม้ในคอมพิวเตอร์เครื่องเดียวกันขึ้นอยู่กับวิธีที่คุณเปิดตัว Python - ตัวอย่างเช่นฉันเห็นรหัสที่ทำงานที่เชลล์ปกติของฉันโดยสมมติว่า UTF-8 เมื่อทำงานผ่าน Apache ด้วยmod_wsgi)
Mark Amery


20
fline=open("myfile").readline().rstrip()

ฉันมาที่นี่เพื่อค้นหาสิ่งนี้ โดยเฉพาะอย่างยิ่งนับตั้งแต่rstrip()ลบอักขระขึ้นบรรทัดใหม่
Shashank Sawant

5
-1; สิ่งนี้จะไม่ปิดไฟล์และส่งกลับผลลัพธ์ที่ไม่ถูกต้องหากบรรทัดแรกมีช่องว่างต่อท้ายใด ๆ นอกเหนือจากอักขระบรรทัดใหม่เอง
Mark Amery

@MarkAmery: จริง ๆ แล้วเนื่องจากตัวจัดการไฟล์ไม่ได้ถูกกำหนดให้กับตัวแปรมันเป็นขยะที่เก็บรวบรวมได้ทันทีซึ่งปิดไฟล์ (แม้ว่าของหลักสูตรการแก้ปัญหาที่ได้รับการยอมรับการใช้การจัดการบริบทคงมีมากดีกว่า.)
acdr

@acdr สิ่งที่คุณพูดเป็นจริงสำหรับ CPython แต่ไม่ได้สำหรับการใช้งานอื่น ๆ หลาม - ดูเช่นPyPy เอกสารเก็บขยะที่พูดถึงเป็นจุดหนึ่งที่น่าสนใจที่"ไฟล์ ... ยังไม่ได้ปิดทันทีเมื่อพวกเขาออกไปจากขอบเขต" ด้วยเหตุผลนี้มันจึงเป็นที่ถกเถียงกันอยู่ (เช่นที่stackoverflow.com/a/7396043/1709587 ) ที่อาศัยพฤติกรรมที่คุณอธิบายว่าเป็นการปฏิบัติที่ไม่ดี
Mark Amery


9

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

my_file.seek(0)
first_line = my_file.readline()

1
เพียงเพื่อความเข้าใจที่ดีขึ้นก็จะเป็น "my_file.seek (0) line = my_file.readline ()"
อัลแบร์โตเปเรซ


6

มีคำตอบอื่น ๆ อีกมากมายที่นี่ แต่เพื่อตอบคำถามที่คุณถามอย่างแม่นยำ (ก่อนที่ @MarkAmery จะไปและแก้ไขคำถามเดิมและเปลี่ยนความหมาย):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

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

โปรดทราบว่านี่ไม่รวม\nอักขระที่ท้ายบรรทัด แต่ฉันสมมติว่าคุณไม่ต้องการมันอยู่ดี (และไฟล์บรรทัดเดียวอาจไม่มีเลย) โปรดทราบว่าถึงแม้ว่ามันจะค่อนข้างสั้นและเร็ว แต่มันก็ทำสำเนาข้อมูลไว้ดังนั้นสำหรับหน่วยความจำขนาดใหญ่มากคุณอาจไม่ได้พิจารณาว่า "มีประสิทธิภาพ" เช่นเคยมันขึ้นอยู่กับ ...


8
หากนี่เป็นไฟล์ขนาดใหญ่ f.read () จะพยายามโหลดไฟล์ทั้งหมดลงในหน่วยความจำซึ่งจะไม่เป็นความคิดที่ดี ทางเลือกที่จะอ่านตัวละครตัวหนึ่งในเวลาจนกว่าขึ้นบรรทัดใหม่หรือ EOF จะพบ
randomThought

ที่จริงแล้วคำตอบอื่น ๆ ทั้งหมดเป็นทางเลือกที่ดีกว่านั้น โดยปกติแล้วการอ่านไฟล์ที่มี readline () และเพื่อน ๆ จะโหลดบล็อกทั้งหมดในแต่ละครั้งอาจให้ 32K หรือให้และค้นหาผ่านเพื่อค้นหาบรรทัดใหม่ถัดไป เร็วขึ้นและมีประสิทธิภาพมากขึ้น คำตอบของฉันจะมีประโยชน์ก็ต่อเมื่อเขาโหลดทุกอย่างเรียบร้อยแล้วซึ่งในกรณีนี้เราสามารถสันนิษฐานได้ว่าเขาโอเคกับการมีทุกอย่างในความทรงจำ
46990 Peter Peter Hansen

2
ฉันไม่เชื่อว่าฉันเปลี่ยนความหมาย มันไม่มีความหมายเลยที่จะถามว่า "อ่าน" บรรทัดแรกจากไฟล์หลังจาก "อ่าน" ทั้งไฟล์ ฉันค่อนข้างชัดเจนว่าเจตนาของผู้ถามคือไม่คิดว่า.read()จะต้องเรียกก่อน
Mark Amery

@ MarkAmery คำถามถูกใช้คำไม่ดี ("ไร้ความหมายสวย") ดังนั้นคุณจึงคาดเดาความตั้งใจ ("ชัดเจนกับฉัน") และทำการตั้งรหัสให้ตรงกัน การตีความของฉันแตกต่างกัน ชัดเจนจนกระทั่งและถ้า harpalss ชี้แจงทั้งหมดที่เรามีเป็นถ้อยคำดั้งเดิมบวกกับการยอมรับคำตอบของเขา (เช่น "ค้นหา (0)") ซึ่งให้ฉันอย่างชัดเจนแสดงให้เห็นว่าเขาได้อ่านในไฟล์อย่างน้อยผ่านบรรทัดแรก
ปีเตอร์แฮนเซน

คุณควรลบคำตอบนี้ มันไม่ใช่วิธีที่ถูกต้องและสามารถหลอกคนได้
Thang

-15
f1 = open("input1.txt", "r")
print(f1.readline())

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