Python - 读取文件



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

打开文件以进行读取

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

要打开文件以进行读取,您可以使用模式 '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 Tutorialspoint.

使用 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 Tutorialspoint.

使用 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 Tutorialspoint.
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 Tutorialspoint.
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()方法将浮点数转换为字节对象:

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()方法将字节对象转换回浮点数:

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,表示相对于当前位置查找,2表示相对于文件末尾查找。

示例

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

从特定偏移量读取文件

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

  • 如果文件使用'a'或'a+'以追加模式打开,则在下次写入时将撤消任何seek()操作。
  • 如果文件仅以追加模式使用'a'打开以进行写入,则此方法本质上是无操作的,但对于以启用读取的追加模式打开的文件(模式'a+')仍然有用。
  • 如果文件使用'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
广告