Hàm tìm kiếm ()?


126

Xin thứ lỗi cho sự nhầm lẫn của tôi ở đây nhưng tôi đã đọc tài liệu liên quan đến hàm tìm kiếm () trong python (sau khi phải sử dụng nó) và mặc dù nó đã giúp tôi nhưng tôi vẫn hơi bối rối về ý nghĩa thực sự của nó, nhưng mọi lời giải thích đều nhiều đánh giá cao, cảm ơn bạn.

Câu trả lời:


232

Về việc seek()không có quá nhiều để lo lắng về.

Trước hết, nó rất hữu ích khi hoạt động trên một tệp đang mở.

Điều quan trọng cần lưu ý là cú pháp của nó như sau:

fp.seek(offset, from_what)

nơi fplà con trỏ tập tin bạn đang làm việc với; offsetcó nghĩa là bạn sẽ di chuyển bao nhiêu vị trí; from_whatxác định điểm tham chiếu của bạn:

  • 0 : có nghĩa là điểm tham chiếu của bạn là điểm bắt đầu của tệp
  • 1 : có nghĩa là điểm tham chiếu của bạn là vị trí tệp hiện tại
  • 2 : có nghĩa là điểm tham chiếu của bạn là phần cuối của tệp

nếu bỏ qua, from_whatmặc định là 0.

Không bao giờ quên rằng khi quản lý tệp, sẽ luôn có một vị trí bên trong tệp đó nơi bạn hiện đang làm việc. Khi chỉ mở, vị trí đó là khởi đầu của tệp, nhưng khi bạn làm việc với nó, bạn có thể tiến lên.
seeksẽ hữu ích cho bạn khi bạn cần đi walkdọc theo tệp đang mở đó, giống như một con đường bạn đang đi vào.


115
1 cho việc giải thích các tham số thứ hai, mặc dù tôi muốn thêm rằng có lẽ bạn nên sử dụng các hằng số os.SEEK_SET, os.SEEK_CURos.SEEK_ENDthay vì những con số kỳ diệu 0, 12, tương ứng.
ArtOfWarfare

Vị trí tìm kiếm là một chỉ mục byte vào nội dung của tệp tương tự như một chỉ mục mảng. Điều thú vị nữa là nếu chúng ta mở tệp ở chế độ chắp thêm 'a', chúng ta không thể tìm cách bắt đầu tệp.
anilmwr

3
Trên thực tế trong trường hợp ở chế độ chắp thêm, chúng ta có thể tìm cách bắt đầu tập tin bằng cách sử dụng fp.seek (0, 0), nhưng ngay khi bạn cố gắng ghi vào tập tin đó, tìm kiếm sẽ lại đặt lại vào cuối tập tin và nội dung sẽ được ghi ở cuối .
anilmwr

1
Cảm ơn - đã học được điều gì đó mới và chỉ phải đọc câu trả lời được giải thích rõ ràng này
Adam Hughes

khi gọi tìm kiếm từ đầu tệp, nó có thực sự bắt đầu 'tìm kiếm' từ đầu tệp mỗi lần không?
Theo Stefou

40

Khi bạn mở một tệp, hệ thống sẽ chỉ đến phần đầu của tệp. Bất kỳ đọc hoặc viết bạn làm sẽ xảy ra từ đầu. Một seek()hoạt động di chuyển con trỏ đến một số phần khác của tệp để bạn có thể đọc hoặc ghi tại nơi đó.

Vì vậy, nếu bạn muốn đọc toàn bộ tệp mà bỏ qua 20 byte đầu tiên, hãy mở tệp, seek(20)để di chuyển đến nơi bạn muốn bắt đầu đọc, sau đó tiếp tục đọc tệp.

Hoặc giả sử bạn muốn đọc mỗi byte thứ 10, bạn có thể viết một vòng lặp seek(9, 1)(di chuyển 9 byte về phía trước so với các vị trí hiện tại), read(1)(đọc một byte), lặp lại.


14
-1: Câu trả lời này không giải thích được tham số thứ hai, và thực tế, như phrased, làm cho nó nghe giống như tham số thứ hai cho biết có bao nhiêu byte được đọc.
ArtOfWarfare

3

Các seekchức năng mong đợi của một bù đắp bằng byte.

Ví dụ về tập tin Ascii:

Vì vậy, nếu bạn có một tệp văn bản với nội dung sau:

đơn giản

abc

Bạn có thể nhảy 1 byte để bỏ qua ký tự đầu tiên như sau:

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

Ví dụ tập tin nhị phân thu thập chiều rộng:

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]

Lưu ý: Một khi bạn gọi readbạn đang thay đổi vị trí của đầu đọc, hành động đó giống như seek.


0

Đối với các chuỗi, hãy quên sử dụng WHENCE: sử dụng f.seek (0) để định vị ở đầu tệp và f.seek (len (f) +1) để định vị ở cuối tệp. Sử dụng mở (tệp, "r +") để đọc / ghi bất cứ nơi nào trong tệp. Nếu bạn sử dụng "a +", bạn sẽ chỉ có thể viết (chắp thêm) vào cuối tệp bất kể bạn định vị con trỏ ở đâu.


Bạn đang nói về các tập tin hoặc chuỗi?
RalfFriedl

Xin lỗi vì sự nhầm lẫn. Đó là tất cả về các tập tin.
Gordon Graham
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.