Python - 读取文件



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

打开文件进行读取

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

要打开文件进行读取,请使用 'r' 模式。这是默认模式,因此如果只需要从文件中读取,则可以省略它。

使用 read() 方法读取文件

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

语法

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


 file_object.read(size)

哪里

  • file_object 是 open() 函数返回的文件对象。
  • size 是从文件中读取的字节数。此参数是可选的。如果省略或设置为负值,则该方法将读取直到文件末尾。

在以下示例中,我们在读取模式下打开文件 “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 qikepu.

使用 readline() 方法读取文件

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

语法

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


 file_object.readline(size)

哪里

  • file_object open() 函数返回的文件对象。
  • size 是一个可选参数,用于指定要从该行读取的最大字节数。如果省略或设置为负值,则该方法将读取直到行尾。

在下面的示例中,我们在读取模式下打开文件 “example.txt”。然后我们使用 readline() 方法读取文件的第一行 -


# 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 qikepu.

使用 readlines() 方法读取文件

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

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

语法

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


 file_object.readlines(hint)

哪里

  • file_object 是 open() 函数返回的文件对象。
  • hint 是一个可选参数,用于指定要读取的字节数。如果指定,则读取最多为指定字节的行,而不必读取整个文件。

在此示例中,我们在读取模式下打开文件 “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 qikepu.
Hi Surya.
How are you?.

使用 “with” 语句

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

使用 with 语句打开文件时,文件会在块的末尾自动关闭,即使块内发生错误也是如此。

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


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

我们得到的输出如下 -

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

以二进制模式读取文件

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

写入二进制文件

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


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

要读取二进制文件,我们需要以 '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

从文件中读取整数数据

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

将整数写入二进制文件

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


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

从二进制文件中读取整数

要从二进制文件中读回整数数据,请使用 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)

从文件中读取浮点数据

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

将浮点数写入二进制文件

要将浮点数据写入二进制文件,我们使用 struct.pack() 方法将浮点数转换为 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)

从二进制文件中读取浮点数

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


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)

使用 “r+” 模式读取和写入文件

当打开文件进行读取时(使用 'r' 或 'rb'),除非关闭文件并以其他模式重新打开,否则无法写入数据。为了同时执行读取和写入操作,我们将 '+' 字符添加到 mode 参数中。使用 'w+' 或 'r+' 模式可以在不关闭文件的情况下同时使用 write() 和 read() 方法。

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

语法

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


 fileObject.seek(offset[, whence])

参数

  • offset - 这是读/写指针在文件中的位置。
  • whence − 这是可选的,默认为 0 表示绝对文件定位,其他值为 1 表示相对于当前位置的 seek,2 表示相对于文件末尾的 seerk。

以下程序以 '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

在 Python 中同时读取和写入文件

当打开文件进行写入时(使用 'w' 或 'a'),无法从中读取,尝试这样做将引发 UnsupportedOperation 错误。

同样,当打开文件进行读取(使用 'r' 或 'rb')时,不允许写入该文件。要在读取和写入之间切换,通常需要关闭文件,然后以所需的模式重新打开它。

要同时执行读取和写入操作,可以将 '+' 字符添加到 mode 参数中。使用 'w+' 或 'r+' 模式可以同时启用 write() read() 方法,而无需关闭文件。

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

在此示例中,我们以 '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)

从 Specific Offset 读取文件

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

  • 如果使用 'a' 或 'a+' 打开文件进行追加,则任何 seek() 操作都将在下次写入时撤消。
  • 如果文件仅用于使用 'a' 在 append 模式下写入,则此方法本质上是无操作,但它对于在启用读取(模式 'a+')的情况下以 append 模式打开的文件仍然很有用。
  • 如果使用 't' 以文本模式打开文件,则只有 tell() 返回的偏移量是合法的。使用其他偏移量会导致未定义的行为。

请注意,并非所有文件对象都是可查找的。

以下示例演示如何使用 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