Python 简明教程

Python - Read Files

从文件中读取涉及打开文件、读取其内容,然后关闭文件释放系统资源。Python 提供了多种从文件中读取的方法,每种方法都适合不同的用例。

Opening a File for Reading

打开文件是读取其内容的第一步。在 Python 中,可以使用 open() 函数打开文件。此函数至少需要一个 filename 的参数,还可以使用 mode 来指定文件打开的目的。

若要打开一个文件来读取,可以使用模式 'r' 。这是默认模式,所以如果您只需要从文件中读取,可以省略此模式。

Reading a File Using read() Method

read() 方法用于在 Python 中读取文件内容。它将文件的整个内容读作一个字符串。当需要一次处理整个文件时,此方法特别有用。

Syntax

以下是 Python 中 read() 方法的基本语法−

file_object.read(size)

其中,

  1. file_object 是由 open() 函数返回的文件对象。

  2. size 是要从文件中读取的字节数。此参数是可选的。省略或设置为负值时,此方法会读取到文件末尾。

Example

在以下示例中,以只读模式打开文件“example.txt”。然后使用 read() 方法读取文件的整个内容 −

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

执行上面的代码后,我们得到以下输出: -

welcome to Tutorialspoint.

Reading a File Using readline() Method

readline() 方法用于一次从文件中读取一行。当需要逐行处理文件时此方法特别有用,尤其是对于一次读取整个内容不切实际的大文件。

Syntax

以下是 Python 中 readline() 方法的基本语法 −

file_object.readline(size)

其中,

  1. file_object 是由 open() 函数返回的文件对象。

  2. size 是一个可选参数,指定要从行读取的最大字节数。省略或设置为负值时,此方法会读取到行尾。

Example

在以下示例中,以只读模式打开文件“example.txt”。然后使用 readline() 方法读取文件的第 1 行 −

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

以下是上面代码的输出: -

welcome to Tutorialspoint.

Reading a File Using readlines() Method

readlines() 方法读取文件中的所有行,并作为字符串列表返回。列表中的每个字符串都代表文件中的单行,包括每行末尾的换行符。

当需要一次处理或分析文件的所有行时,此方法特别有用。

Syntax

以下是 Python 中 readlines() 方法的基本语法 −

file_object.readlines(hint)

其中,

  1. file_object 是由 open() 函数返回的文件对象。

  2. hint 是一个可选参数,指定要读取的字节数。如果指定了此参数,它会读取指定字节数的行,而不一定会读取整个文件。

Example

在此示例中,以只读模式打开文件“example.txt”。然后使用 readlines() 方法读取文件中的所有行,并作为字符串列表返回 −

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

以上代码的输出如下所示 −

welcome to Tutorialspoint.
Hi Surya.
How are you?.

Using "with" Statement

Python 中的 “with” 语句用于异常处理。处理文件时,使用 “with” 语句可确保文件在读取后正确关闭,即使出现异常也是如此。

Example

以下是一个使用 with 语句打开、读取和打印文件内容的简单示例 −

# Using the with statement to open a file
with open('example.txt', 'r') as file:
   content = file.read()
   print(content)

我们得到了如下输出 −

welcome to Tutorialspoint.
Hi Surya.
How are you?.

Reading a File in Binary Mode

默认情况下,对文件对象执行的读/写操作在文本字符串数据上进行。如果我们要处理不同类型文件,例如媒体文件 (mp3)、可执行文件 (exe) 或图片 (jpg),则必须通过在读/写模式中添加 'b' 前缀以二进制模式打开文件。

Writing to a Binary File

假设 test.bin 文件已以二进制模式写入 −

# Open the file in binary write mode
with open('test.bin', 'wb') as f:
   data = b"Hello World"
   f.write(data)

Example

要读取二进制文件,我们需要以 'rb' 模式打开它。然后对 read() 方法的返回值进行解码,然后再进行打印 −

# Open the file in binary read mode
with open('test.bin', 'rb') as f:
   data = f.read()
   print(data.decode(encoding='utf-8'))

它将生成如下输出:

Hello World

Reading Integer Data From a File

要将整数数据写入二进制文件,应使用 to_bytes() 方法将整数对象转换为字节。

Writing an Integer to a Binary File

以下是如何将整数写入二进制文件的示例 −

# 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

要从二进制文件中读回整数数据,请使用 from_bytes() 方法将 read() 函数的输出转换回整数 −

# 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

对于在二进制文件中处理浮点数数据,我们需要使用来自 Python 标准库的 struct 模块。此模块有助于在 Python 值和表示为 Python 字节对象的 C 结构之间进行转换。

Writing a Float to a Binary File

要将浮点数数据写入二进制文件,我们将使用 struct.pack() 方法将浮点数转换为字节对象 −

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

要从二进制文件中读取浮点数数据,我们将使用 struct.unpack() 方法将字节对象转换回浮点数 −

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

当一个文件打开用于读取 (使用 'r' 或 'rb') 时,不可能写入数据,除非关闭文件并以不同模式重新打开。要同时执行读和写操作,我们在模式参数中添加 '' 字符。使用 'w' 或 'r+' 模式时,可以使用 write() 和 read() 方法,而不必关闭文件。

File 对象还支持 seek() 函数,它允许将读/写指针重新定位到文件中的任何所需的字节位置。

Syntax

以下是 seek() 方法的语法:

fileObject.seek(offset[, whence])

Parameters

  1. offset − 这是文件内读/写指针的位置。

  2. whence − 这是可选的,默认为 0,表示绝对文件定位,其他值为 1,表示相对于当前位置查找,2 表示相对于文件末尾查找。

Example

以下程序以 'r+' 模式(读写模式)打开一个文件,寻找文件中的某个位置,并从该位置读取数据 −

# 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)

执行上面的代码后,我们得到以下输出: -

rat

Reading and Writing to a File Simultaneously in Python

当一个文件打开用于写入 (使用 'w' 或 'a') 时,不可能从中读取数据,并且尝试这样做会引发 UnsupportedOperation 错误。

类似地,当一个文件打开用于读取 (使用 'r' 或 'rb') 时,不允许写入数据。要在读和写之间切换,通常需要关闭文件,然后以所需模式重新打开。

要同时执行读和写操作,可以在模式参数中添加 '' 字符。使用 'w' 或 'r+' 模式时,可以使用 write() 和 read() 方法,而不必关闭文件。

此外,File 对象还支持 seek() 函数,它允许将读/写指针重新定位到文件中的任何所需的字节位置。

Example

在此示例中,我们以 'r+' 模式打开文件并向文件中写入数据。seek(0) 方法将指针重新定位到文件开头 −

# 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

我们可以使用 seek() 方法在指定偏移处设置他文件当前的位置。

  1. 如果使用“a”或“a+”打开文件以进行追加,则在下次写入时将取消任何 seek() 操作。

  2. 如果仅使用“a”以追加模式打开文件以进行写入,则此方法基本上是一种无操作,但对于以启用读模式(模式“a+”)打开的追加模式文件仍然有用。

  3. 如果使用 't' 以文本模式打开文件,tell() 返回的偏移量合法。使用其他偏移量将导致未定义的行为。

请注意并非所有文件对象都可寻址。

Example

以下示例演示了如何使用 seek() 方法对文件执行同时读/写操作。文件以 w+ 模式(读写模式)打开,添加了一些数据,然后在特定位置读取和修改该文件 −

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

以下是上面代码的输出: -

Data read from position 10: rat
Updated file content: This is a cat race