Tập tin tìm kiếm trong python là gì?

Xử lý tệp là một khái niệm quan trọng của lập trình. Nó cho phép chúng ta lưu thông tin vào bộ nhớ vĩnh viễn. Xử lý tệp trong python cung cấp các tính năng tuyệt vời cùng với việc lập trình dễ dàng

Hàm seek() trong python là một trong những tính năng tuyệt vời này. seek() trong python cho phép chúng ta thao tác xử lý tệp sao cho các phần khác nhau của tệp có thể được truy cập ngẫu nhiên

Hàm seek() trong python được bổ sung bởi hàm tell() cung cấp vị trí hiện tại của tệp xử lý

Cú pháp tìm kiếm () trong Python

Hàm seek() là một phương thức lớp có sẵn bên trong đối tượng con trỏ tệp. Để gọi seek() trong python, đầu tiên chúng ta cần khai báo một con trỏ tệp bằng cách mở một tệp

Cú pháp của "seek()" trong python là

file_pointer.seek(offset[, from_where])

Tham số của seek() trong Python

Như đã thấy trong cú pháp trên, hàm seek() trong python có hai tham số

  • bù lại. bắt buộc, số lượng ký tự để di chuyển xử lý tệp
  • từ đâu. tùy chọn, điểm tham chiếu mà từ đó phần xử lý tệp được di chuyển tương đối

Tham số offset cho biết số lượng ký tự để di chuyển xử lý tệp. Đó là một số nguyên làm cho con trỏ tệp di chuyển theo số ký tự đã cho (hoặc byte, nếu tệp được mở ở chế độ nhị phân)

Ví dụ sử dụng offset

Tham số from_where là điểm tham chiếu từ đó con trỏ tệp sẽ được di chuyển

Đối số này là tùy chọn và nhận một trong ba giá trị

  • os. SEEK_SET (hoặc 0).
    mặc định, offset cung cấp vị trí tuyệt đối của con trỏ tệp.
  • os. SEEK_CUR (hoặc 1).
    offset cung cấp vị trí mới tương ứng với vị trí hiện tại của con trỏ tệp.
  • os. SEEK_END (hoặc 2).
    offset đưa ra vị trí tương ứng với vị trí kết thúc của tệp.

Ví dụ sử dụng from_where

file_handle.seek(-2, os.SEEK_CUR)

Ghi chú.
Rằng tham chiếu tương đối (os. SEEK_CUR và hệ điều hành. SEEK_END) yêu cầu mở tệp ở chế độ nhị phân.

Giá trị trả về của seek() trong Python

Hàm seek() trong python trả về một giá trị số nguyên biểu thị vị trí mới của con trỏ tệp

Loại trả lại. số nguyên

Thí dụ. Chương trình sau Hiển thị giá trị trả về được cung cấp bởi seek()

Nội dung của mẫu. tập tin txt là

This is just a sample file

file_pointer = open("sample.txt")
current_position = file_pointer.tell()
new_position = file_pointer.seek(30)
print(current_position)
print(new_position)
new_position = file_pointer.seek(12)
print(new_position)

đầu ra

Ngoại lệ của seek() trong Python

Phương thức tìm kiếm có thể gây ra ngoại lệ io. Hoạt động không được hỗ trợ. Ngoại lệ này xảy ra khi chúng tôi cố gắng tìm kiếm liên quan đến hiện tại hoặc kết thúc khi tệp được mở ở chế độ không nhị phân

Chế độ nhị phân.
Ở chế độ này, tệp được đọc từng chút một, chế độ này được sử dụng để đọc các tệp nhị phân đặc biệt mà con người không thể hiểu được.

Chế độ phi nhị phân.
Nó còn được gọi là chế độ ký tự, trong đó tệp được đọc từng ký tự một. Những tập tin này là con người có thể đọc được.

Thí dụ. Chứng minh ngoại lệ của seek() trong Python

>> import os
>> file_handle = open('sample.txt') # non-binary mode
>> file_handle.seek(765)
# 765

>> file_handle.seek(7, os.SEEK_CUR)
# Traceback (most recent call last):
#  File "", line 1, in 
# io.UnsupportedOperation: can't do nonzero cur-relative seeks

>> file_handle.seek(8, os.SEEK_END)
# Traceback (most recent call last):
#  File "", line 1, in 
# io.UnsupportedOperation: can't do nonzero end-relative seeks

Ghi chú

  • Tìm kiếm (765) sẽ không đưa ra ngoại lệ ngay cả khi độ dài tệp nhỏ hơn 765
  • Tất cả các thao tác đọc-ghi tiếp theo sẽ được thực hiện từ chính vị trí con trỏ tệp mới này
  • Ví dụ: readline() sau seek(765) sẽ trả về một chuỗi rỗng ('')

Ví dụ về seek() trong Python

Thí dụ. Đoạn mã sau minh họa cách sử dụng cơ bản của hàm seek() trong Python

Nội dung của "mẫu. txt" là

file_handle = open('sample.txt')
print(file_handle.tell())
print(file_handle.seek(10))
print(file_handle.readline())

đầu ra

Tìm kiếm () trong Python là gì?

Cho đến bây giờ, chúng ta đã thấy nhiều bit khác nhau tạo nên hàm seek(). Bây giờ, chúng ta hãy xem xét toàn bộ seek()

Hàm seek() trong python cho phép chúng tôi truy cập các phần khác nhau của tệp đã mở theo yêu cầu của chúng tôi. Điều này cho phép chúng tôi thực hiện các thao tác đọc-ghi một cách ngẫu nhiên

seek() lấy một đối số bắt buộc offset và một đối số tùy chọn from_where, đồng thời trả về vị trí mới của con trỏ tệp. Nó rất hữu ích cho các hoạt động xử lý tệp vì nó cho phép chúng tôi chuyển đến một phần cụ thể của tệp

Cần mở một trình điều khiển tệp để chức năng tìm kiếm () có thể hoạt động. Nếu phần xử lý tệp được mở ở chế độ ghi thêm ('aw') thì mọi thao tác được thực hiện bằng seek() đều vô dụng

Trong bức tranh lớn, chức năng tìm kiếm thao tác với con trỏ tệp. Con trỏ này sau đó ảnh hưởng đến vị trí đọc và ghi của thao tác tệp cụ thể đó

Thêm ví dụ

Đối với phần còn lại của các ví dụ, chúng tôi sẽ sử dụng "mẫu. txt" với nội dung

This is a sample file
the second line in the sample file

Ví dụ 1. Tìm kiếm chuyển tiếp qua dòng và sau đó đọc phần còn lại của tệp

file_pointer = open('sample.txt')
print(file_pointer.seek(5))
print(file_pointer.read())

đầu ra

________số 8

Giải thích.
Khi chúng tôi mở tệp, chúng tôi đã không cung cấp bất kỳ đối số nào khác sau tên tệp. Do đó, tệp được mở ở chế độ không nhị phân (hoặc ký tự). Trong dòng mã thứ hai, chúng tôi tìm kiếm 5 ký tự phía trước của tệp và đọc phần còn lại của tệp. 5 ký tự đầu tiên của tệp "This " không được nhìn thấy trong đầu ra.


Ví dụ - 2. Việc sử dụng các giá trị bù trừ âm

import os

file_pointer = open('sample.txt', 'rb') # binary mode
print(file_pointer.tell())
print(file_pointer.seek(-20, os.SEEK_END))
print(file_pointer.read())

đầu ra

file_handle.seek(-2, os.SEEK_CUR)
0

Ghi chú.
Hàm read() trả về một mảng byte (b'') thay vì một chuỗi vì chúng ta đã mở tệp ở chế độ nhị phân ('rb')

Giải thích.
Để sử dụng giá trị offset âm, chúng ta cần mở tệp ở chế độ nhị phân. sử dụng hệ điều hành. SEEK_END làm điểm tham chiếu cho phần bù vì điểm tham chiếu mặc định là phần đầu của tệp và các giá trị âm từ phần đầu của tệp không được phép. Chúng ta cũng có thể thấy rằng kiểu trả về từ hàm read() là một mảng byte khi tệp được mở ở chế độ nhị phân.


Ví dụ - 3. Đọc chiều rộng của tệp Png

file_handle.seek(-2, os.SEEK_CUR)
1

đầu ra

Giải thích.
Trong phần này, chúng tôi sử dụng seek() để đọc chiều cao và chiều rộng của một. tập tin hình ảnh png. Thư viện urllib được sử dụng để tải xuống google. tập tin png. Điều kỳ diệu thực sự xảy ra khi chúng ta gọi seek(16). Bất cứ gì. png, nó được định nghĩa trong cấu trúc rằng chiều rộng của hình ảnh là một số nguyên 4 byte nằm ở phần bù byte thứ 16 của. tập tin png. Ngoài ra, chiều cao của hình ảnh được cung cấp dưới dạng số nguyên 4 byte trên phần bù byte thứ 20 của. tập tin png. Chúng tôi đã sử dụng thư viện struct để chuyển đổi giá trị nhị phân của số nguyên 4 byte thành giá trị nguyên của biến python.

Sự kết luận

Trong bài viết này, chúng ta đã hiểu hoạt động của seek() trong python. Cùng với các khái niệm sau

Tìm kiếm trong hệ thống tập tin là gì?

Mô tả. Thao tác Tìm kiếm cho phép chương trình ứng dụng thay đổi giá trị của con trỏ tệp để việc Đọc/Ghi tiếp theo được thực hiện từ một vị trí mới trong tệp . Giá trị mới của con trỏ tệp được xác định bằng cách thêm phần bù vào giá trị hiện tại.

Mục đích của 0 1 & 2 được sử dụng trong chế độ chức năng tìm kiếm tệp mở hiện có là gì?

0. Giá trị 0 được sử dụng để đặt đối số từ đâu ở đầu tệp. 1. Giá trị 1 được sử dụng để đặt đối số wherece ở vị trí hiện tại của tệp. 2. Giá trị 2 được sử dụng để đặt đối số từ đâu ở cuối tệp

Con trỏ tệp trong Python là gì?

Con trỏ tệp nằm ở ở cuối tệp nếu tệp tồn tại . Tệp mở ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi.

SEEK() có hoạt động đối với các tệp nhị phân không?

seek() chỉ thay đổi vị trí trong tệp - bạn vẫn phải đọc() những gì nằm ở vị trí đó. seek() trả về vị trí tệp mới, không phải nội dung tệp tại vị trí đó. Sau khi tìm kiếm, bạn cần đọc() để lấy nội dung tệp.