แสวงหา () ฟังก์ชั่น?


127

ขอแก้ตัวในความสับสนของฉันที่นี่ แต่ฉันได้อ่านเอกสารเกี่ยวกับฟังก์ชั่นการค้นหา () ใน python (หลังจากที่ต้องใช้งาน) และแม้ว่ามันจะช่วยฉันได้ แต่ฉันก็ยังสับสนเล็กน้อยเกี่ยวกับความหมายที่แท้จริงของสิ่งที่ทำ แต่คำอธิบายใด ๆ ก็มีมาก ชื่นชมขอบคุณ

คำตอบ:


234

เกี่ยวกับ seek()นี้ไม่ต้องกังวลมากเกินไป

ก่อนอื่นมันมีประโยชน์เมื่อใช้งานกับไฟล์ที่เปิดอยู่

สิ่งสำคัญที่ต้องทราบว่าไวยากรณ์มีดังนี้:

fp.seek(offset, from_what)

ที่fpเป็นตัวชี้ไฟล์ที่คุณกำลังทำงานกับ; offsetหมายถึงจำนวนตำแหน่งที่คุณจะย้าย from_whatกำหนดจุดอ้างอิงของคุณ:

  • 0 : หมายถึงจุดอ้างอิงของคุณคือจุดเริ่มต้นของไฟล์
  • 1 : หมายถึงจุดอ้างอิงของคุณคือตำแหน่งไฟล์ปัจจุบัน
  • 2 : หมายถึงจุดอ้างอิงของคุณคือจุดสิ้นสุดของไฟล์

หากละเว้นfrom_whatค่าเริ่มต้นคือ 0

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


115
+1 สำหรับอธิบายพารามิเตอร์ที่สองแม้ว่าฉันต้องการที่จะเพิ่มที่คุณอาจจะใช้คงที่os.SEEK_SET, os.SEEK_CURและos.SEEK_ENDแทนหมายเลขมายากล0, 1และ2ตามลำดับ
ArtOfWarfare

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

3
จริงๆแล้วในกรณีของโหมดผนวกเราสามารถค้นหาจุดเริ่มต้นของไฟล์ได้โดยใช้ fp.seek (0, 0) แต่ทันทีที่คุณพยายามเขียนไปที่ไฟล์นั้นการค้นหาจะถูกรีเซ็ตเป็นจุดสิ้นสุดของไฟล์อีกครั้งและเนื้อหาจะถูกเขียนในตอนท้าย .
anilmwr

1
ขอบคุณ - เรียนรู้สิ่งใหม่ ๆ และต้องอ่านคำตอบที่อธิบายอย่างชัดเจนนี้เท่านั้น
Adam Hughes

เมื่อเรียกค้นหาจากจุดเริ่มต้นของไฟล์มันจะเริ่ม 'ค้นหา' จากจุดเริ่มต้นของไฟล์ทุกครั้งหรือไม่?
Theo Stefou

40

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

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

หรือบอกว่าคุณต้องการอ่านทุกๆ 10 ไบต์คุณสามารถเขียนลูปที่ทำseek(9, 1)(เลื่อนไปข้างหน้า 9 ไบต์เทียบกับตำแหน่งปัจจุบัน) read(1)(อ่านทีละไบต์) ทำซ้ำ


14
-1: คำตอบนี้ไม่สามารถอธิบายพารามิเตอร์ที่สองได้และจริงๆแล้วในฐานะวลีทำให้ดูเหมือนว่าพารามิเตอร์ที่สองกำหนดจำนวนไบต์ที่อ่าน
ArtOfWarfare

3

seekฟังก์ชั่นคาดหวังฯชดเชยไบต์

ตัวอย่างไฟล์ Ascii:

ดังนั้นหากคุณมีไฟล์ข้อความที่มีเนื้อหาต่อไปนี้:

simple.txt

abc

คุณสามารถข้าม1 ไบต์เพื่อข้ามอักขระตัวแรกดังต่อไปนี้:

fp = open('simple.txt', 'r')
fp.seek(1)
print fp.readline()
>>> bc

ตัวอย่างไฟล์ไบนารีการรวบรวมความกว้าง:

fp = open('afile.png', 'rb')
fp.seek(16)
print 'width: {0}'.format(struct.unpack('>i', fp.read(4))[0])
print 'height: ', struct.unpack('>i', fp.read(4))[0]

หมายเหตุ:เมื่อคุณโทรหาคุณมีการเปลี่ยนแปลงตำแหน่งของหัวอ่านซึ่งการกระทำเช่นreadseek


0

สำหรับสตริงอย่าลืมใช้ WHENCE: ใช้ f.seek (0) เพื่อวางตำแหน่งที่จุดเริ่มต้นของไฟล์และ f.seek (len (f) +1) เพื่อวางตำแหน่งที่ท้ายไฟล์ ใช้เปิด (ไฟล์ "r +") เพื่ออ่าน / เขียนที่ใดก็ได้ในไฟล์ หากคุณใช้ "a +" คุณจะสามารถเขียน (ต่อท้าย) ที่ส่วนท้ายของไฟล์ได้เท่านั้นไม่ว่าคุณจะวางเคอร์เซอร์ไว้ที่ใดก็ตาม


คุณกำลังพูดถึงไฟล์หรือสตริง?
RalfFriedl

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