Đọc từ một tệp bao gồm việc mở tệp, đọc nội dung của nó và sau đó đóng tệp để giải phóng tài nguyên hệ thống. Python cung cấp một số phương pháp để đọc từ tệp, mỗi phương pháp phù hợp với các trường hợp sử dụng khác nhau.
Mở một tệp là bước đầu tiên trong việc đọc nội dung của nó. Trong Python, bạn sử dụng hàm open() để mở một tệp. Hàm này yêu cầu ít nhất một tham số, đó là tên tệp, và tùy chọn một chế độ để chỉ định mục đích mở tệp.
Để mở một tệp để đọc, bạn sử dụng chế độ 'r' . Đây là chế độ mặc định, vì vậy bạn có thể bỏ qua nó nếu bạn chỉ cần đọc từ tệp.
Phương thức read() được sử dụng để đọc nội dung của một tệp trong Python. Nó đọc toàn bộ nội dung của tệp dưới dạng một chuỗi duy nhất. Phương thức này đặc biệt hữu ích khi bạn cần xử lý toàn bộ tệp cùng một lúc.
Dưới đây là cú pháp cơ bản của phương thức read() trong Python −
file_object.read(size)
Ở đâu,
Trong ví dụ dưới đây, chúng ta đang mở tệp "example.txt" ở chế độ đọc. Sau đó, chúng ta sử dụng phương thức read() để đọc toàn bộ nội dung của tệp −
# Open the file in read mode file = open('example.txt', 'r') # Read the entire content of the file content = file.read() # Print the content print(content) # Close the file file.close()
Sau khi thực thi đoạn mã trên, chúng ta nhận được đầu ra sau:
welcome to Tutorialspoint.
Phương thức readline() được sử dụng để đọc một dòng từ tệp một lần. Phương thức này rất hữu ích khi bạn cần xử lý một tệp theo từng dòng, đặc biệt là đối với các tệp lớn mà việc đọc toàn bộ nội dung một lần là không thực tế.
Dưới đây là cú pháp cơ bản của phương thức readline() trong Python −
file_object.readline(size)
Ở đâu,
Trong ví dụ dưới đây, chúng ta đang mở tệp "example.txt" ở chế độ đọc. Sau đó, chúng ta sử dụng phương thức readline() để đọc dòng đầu tiên của tệp −
# Open the file in read mode file = open('example.txt', 'r') # Read the first line of the file line = file.readline() # Print the line print(line) # Close the file file.close()
Dưới đây là kết quả của đoạn mã trên −
welcome to Tutorialspoint.
Phương thức readlines() đọc tất cả các dòng từ một tệp và trả về chúng dưới dạng một danh sách các chuỗi. Mỗi chuỗi trong danh sách đại diện cho một dòng duy nhất từ tệp, bao gồm cả ký tự xuống dòng ở cuối mỗi dòng.
Phương pháp này đặc biệt hữu ích khi bạn cần xử lý hoặc phân tích tất cả các dòng của một tệp cùng một lúc.
Dưới đây là cú pháp cơ bản của phương thức readlines() trong Python −
file_object.readlines(hint)
Ở đâu,
Trong ví dụ này, chúng ta đang mở tệp "example.txt" ở chế độ đọc. Sau đó, chúng ta sử dụng phương thức readlines() để đọc tất cả các dòng từ tệp và trả về chúng dưới dạng một danh sách các chuỗi −
# Open the file in read mode file = open('example.txt', 'r') # Read all lines from the file lines = file.readlines() # Print the lines for line in lines: print(line, end='') # Close the file file.close()
Đầu ra của đoạn mã trên được hiển thị như sau −
welcome to Tutorialspoint. Hi Surya. How are you?.
Câu lệnh "with" trong Python được sử dụng để xử lý ngoại lệ. Khi làm việc với tệp, việc sử dụng câu lệnh "with" đảm bảo rằng tệp sẽ được đóng đúng cách sau khi đọc, ngay cả khi có ngoại lệ xảy ra.
When you use a with statement to open a file, the file is automatically closed at the end of the block, even if an error occurs within the block.
Dưới đây là một ví dụ đơn giản về việc sử dụng câu lệnh with để mở, đọc và in nội dung của một tệp −
# Using the with statement to open a file with open('example.txt', 'r') as file: content = file.read() print(content)
Chúng ta nhận được đầu ra như sau −
welcome to Tutorialspoint. Hi Surya. How are you?.
Theo mặc định, các thao tác đọc/ghi trên một đối tượng tệp được thực hiện trên dữ liệu chuỗi văn bản. Nếu chúng ta muốn xử lý các loại tệp khác nhau, chẳng hạn như tệp đa phương tiện (mp3), tệp thực thi (exe) hoặc hình ảnh (jpg), chúng ta phải mở tệp ở chế độ nhị phân bằng cách thêm tiền tố 'b' vào chế độ đọc/ghi.
Giả sử rằng tệp test.bin đã được ghi ở chế độ nhị phân −
# Open the file in binary write mode with open('test.bin', 'wb') as f: data = b"Hello World" f.write(data)
Để đọc một tệp nhị phân, chúng ta cần mở nó ở chế độ 'rb'. Giá trị trả về của phương thức read() sau đó được giải mã trước khi in ra.
# Open the file in binary read mode with open('test.bin', 'rb') as f: data = f.read() print(data.decode(encoding='utf-8'))
Nó sẽ tạo ra đầu ra sau đây −
Hello World
Để ghi dữ liệu số nguyên vào một tệp nhị phân, đối tượng số nguyên nên được chuyển đổi thành bytes bằng cách sử dụng phương thức to_bytes().
Dưới đây là một ví dụ về cách ghi một số nguyên vào một tệp nhị phân −
# Convert the integer to bytes and write to a binary file n = 25 data = n.to_bytes(8, 'big') with open('test.bin', 'wb') as f: f.write(data)
Để đọc lại dữ liệu số nguyên từ tệp nhị phân, hãy chuyển đổi đầu ra của hàm read() trở lại thành số nguyên bằng cách sử dụng phương thức from_bytes() −
# Read the binary data from the file and convert it back to an integer with open('test.bin', 'rb') as f: data = f.read() n = int.from_bytes(data, 'big') print(n)
Để xử lý dữ liệu số thực trong các tệp nhị phân, chúng ta cần sử dụng mô-đun struct từ thư viện tiêu chuẩn của Python. Mô-đun này giúp chuyển đổi giữa các giá trị Python và các cấu trúc C được biểu diễn dưới dạng đối tượng bytes của Python.
Để ghi dữ liệu số thực vào một tệp nhị phân, chúng ta sử dụng phương thức struct.pack() để chuyển đổi số thực thành một đối tượng bytes.
import struct # Define a floating-point number x = 23.50 # Pack the float into a binary format data = struct.pack('f', x) # Open the file in binary write mode and write the packed data with open('test.bin', 'wb') as f: f.write(data)
Để đọc dữ liệu số thực từ một tệp nhị phân, chúng ta sử dụng phương thức struct.unpack() để chuyển đổi đối tượng bytes trở lại thành một số thực.
import struct # Open the file in binary read mode with open('test.bin', 'rb') as f: # Read the binary data from the file data = f.read() # Unpack the binary data to retrieve the float x = struct.unpack('f', data)[0] # Print the float value print(x)
Khi một file được mở để đọc (với 'r' hoặc 'rb'), việc ghi dữ liệu là không thể trừ khi file được đóng và mở lại ở chế độ khác. Để thực hiện cả hai thao tác đọc và ghi đồng thời, chúng ta thêm ký tự '+' vào tham số chế độ. Sử dụng chế độ 'w+' hoặc 'r+' cho phép sử dụng cả phương thức write() và read() mà không cần phải đóng file.
Đối tượng File cũng hỗ trợ hàm seek(), cho phép định vị lại con trỏ đọc/ghi đến bất kỳ vị trí byte nào mong muốn trong tệp.
Dưới đây là cú pháp cho phương thức seek() −
fileObject.seek(offset[, whence])
offset − Đây là vị trí của con trỏ đọc/ghi trong tệp.
whence − Đây là tùy chọn và mặc định là 0, có nghĩa là định vị file tuyệt đối, các giá trị khác là 1 có nghĩa là tìm kiếm tương đối với vị trí hiện tại và 2 có nghĩa là tìm kiếm tương đối với cuối file.
Chương trình sau mở một tệp trong chế độ 'r+' (chế độ đọc-ghi), tìm một vị trí nhất định trong tệp và đọc dữ liệu từ vị trí đó −
# Open the file in read-write mode with open("foo.txt", "r+") as fo: # Move the read/write pointer to the 10th byte position fo.seek(10, 0) # Read 3 bytes from the current position data = fo.read(3) # Print the read data print(data)
Sau khi thực thi đoạn mã trên, chúng ta nhận được đầu ra sau:
rat
Khi một tệp được mở để ghi (với 'w' hoặc 'a'), không thể đọc từ nó, và việc cố gắng làm như vậy sẽ gây ra lỗi UnsupportedOperation .
Tương tự, khi một tệp được mở để đọc (với 'r' hoặc 'rb'), việc ghi vào nó là không được phép. Để chuyển đổi giữa việc đọc và ghi, bạn thường cần đóng tệp và mở lại nó ở chế độ mong muốn.
Để thực hiện cả hai thao tác đọc và ghi đồng thời, bạn có thể thêm ký tự '+' vào tham số chế độ. Sử dụng chế độ 'w+' hoặc 'r+' cho phép cả hai phương thức write() và read() mà không cần phải đóng tệp.
Ngoài ra, đối tượng File hỗ trợ hàm seek(), cho phép bạn định vị lại con trỏ đọc/ghi đến bất kỳ vị trí byte nào mong muốn trong tệp.
Trong ví dụ này, chúng ta mở tệp trong chế độ 'r+' và ghi dữ liệu vào tệp. Phương thức seek(0) định vị lại con trỏ về đầu tệp.
# Open the file in read-write mode with open("foo.txt", "r+") as fo: # Write data to the file fo.write("This is a rat race") # Rewind the pointer to the beginning of the file fo.seek(0) # Read data from the file data = fo.read() print(data)
Chúng ta có thể đặt vị trí hiện tại của tệp tại vị trí bù được chỉ định bằng cách sử dụng phương thức seek() .
Lưu ý rằng không phải tất cả các đối tượng tệp đều có thể tìm kiếm.
Ví dụ dưới đây minh họa cách sử dụng phương thức seek() để thực hiện các thao tác đọc/ghi đồng thời trên một tệp. Tệp được mở ở chế độ w+ (chế độ đọc-ghi), một số dữ liệu được thêm vào, và sau đó tệp được đọc và sửa đổi tại một vị trí cụ thể.
# Open a file in read-write mode fo = open("foo.txt", "w+") # Write initial data to the file fo.write("This is a rat race") # Seek to a specific position in the file fo.seek(10, 0) # Read a few bytes from the current position data = fo.read(3) print("Data read from position 10:", data) # Seek back to the same position fo.seek(10, 0) # Overwrite the earlier contents with new text fo.write("cat") # Rewind to the beginning of the file fo.seek(0, 0) # Read the entire file content data = fo.read() print("Updated file content:", data) # Close the file fo.close()
Dưới đây là kết quả của đoạn mã trên −
Data read from position 10: rat Updated file content: This is a cat race