Python - Read Files

Đọ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.

Opening a File for Reading

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.

Reading a File Using read() Method

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.

Syntax

Dưới đây là cú pháp cơ bản của phương thức read() trong Python −

file_object.read(size)

Ở đâu,

  • file_object is the file object returned by the open() function.
  • size is the number of bytes to read from the file. This parameter is optional. If omitted or set to a negative value, the method reads until the end of the file.

Example

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.

Reading a File Using readline() Method

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ế.

Syntax

Dưới đây là cú pháp cơ bản của phương thức readline() trong Python −

file_object.readline(size)

Ở đâu,

  • file_object is the file object returned by the open() function.
  • size is an optional parameter specifying the maximum number of bytes to read from the line. If omitted or set to a negative value, the method reads until the end of the line.

Example

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.

Reading a File Using readlines() Method

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.

Syntax

Dưới đây là cú pháp cơ bản của phương thức readlines() trong Python −

file_object.readlines(hint)

Ở đâu,

  • file_object is the file object returned by the open() function.
  • hint is an optional parameter that specifies the number of bytes to read. If specified, it reads lines up to the specified bytes, not necessarily reading the entire file.

Example

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?.

Using "with" Statement

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.

Example

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?.

Reading a File in Binary Mode

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.

Writing to a Binary File

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)

Example

Để đọ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

Reading Integer Data From a File

Để 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().

Writing an Integer to a Binary File

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)

Reading an Integer from a Binary File

Để đọ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)

Reading Float Data From a File

Để 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.

Writing a Float to a Binary File

Để 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)

Reading Float Numbers from a Binary File

Để đọ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)

Reading and Writing to a File Using "r+" Mode

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.

Syntax

Dưới đây là cú pháp cho phương thức seek() −

fileObject.seek(offset[, whence])

Parameters

  • 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.

Example

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

Reading and Writing to a File Simultaneously in Python

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.

Example

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)

Reading a File from Specific Offset

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() .

  • If the file is opened for appending using either 'a' or 'a+', any seek() operations will be undone at the next write.
  • If the file is opened only for writing in append mode using 'a', this method is essentially a no-op, but it remains useful for files opened in append mode with reading enabled (mode 'a+').
  • If the file is opened in text mode using 't', only offsets returned by tell() are legal. Use of other offsets causes undefined behavior.

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.

Example

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