Câu trả lời:
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 fp
là con trỏ tập tin bạn đang làm việc với; offset
có nghĩa là bạn sẽ di chuyển bao nhiêu vị trí; from_what
xác định điểm tham chiếu của bạn:
nếu bỏ qua, from_what
mặ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.
seek
sẽ hữu ích cho bạn khi bạn cần đi walk
dọc theo tệp đang mở đó, giống như một con đường bạn đang đi vào.
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.
Các seek
chức năng mong đợi của một bù đắp bằng byte.
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
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
read
bạn đang thay đổi vị trí của đầu đọc, hành động đó giống nhưseek
.
Đố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.
os.SEEK_SET
,os.SEEK_CUR
vàos.SEEK_END
thay vì những con số kỳ diệu0
,1
và2
, tương ứng.