从文件中读取包括打开文件、读取其内容,然后关闭文件以释放系统资源。Python 提供了多种从文件中读取数据的方法,每种方法都适用于不同的用例。
打开文件进行读取
打开文件是读取其内容的第一步。在 Python 中,您可以使用 open() 函数打开文件。此函数至少需要一个参数、filename 和指定打开文件目的的模式(可选)。
要打开文件进行读取,请使用 'r' 模式。这是默认模式,因此如果只需要从文件中读取,则可以省略它。
使用 read() 方法读取文件
read() 方法用于读取 Python 中的文件内容。它将文件的全部内容作为单个字符串读取。当您需要一次处理整个文件时,此方法特别有用。
语法
以下是 Python 中 read() 方法的基本语法 -
哪里
- file_object 是 open() 函数返回的文件对象。
- size 是从文件中读取的字节数。此参数是可选的。如果省略或设置为负值,则该方法将读取直到文件末尾。
在以下示例中,我们在读取模式下打开文件 “example.txt”。然后我们使用 read() 方法读取文件的全部内容 -
执行上述代码后,我们得到以下输出 -
使用 readline() 方法读取文件
readline() 方法用于一次从文件中读取一行。当您需要逐行处理文件时,此方法非常有用,尤其是对于一次读取整个内容不切实际的大文件。
语法
以下是 Python 中 readline() 方法的基本语法 -
哪里
- file_object 是 open() 函数返回的文件对象。
- size 是一个可选参数,用于指定要从该行读取的最大字节数。如果省略或设置为负值,则该方法将读取直到行尾。
例
在下面的示例中,我们在读取模式下打开文件 “example.txt”。然后我们使用 readline() 方法读取文件的第一行 -
以下是上述代码的输出 -
使用 readlines() 方法读取文件
readlines() 方法从文件中读取所有行,并将它们作为字符串列表返回。列表中的每个字符串都表示文件中的一行,包括每行末尾的换行符。
当您需要一次处理或分析文件的所有行时,此方法特别有用。
语法
以下是 Python 中 readlines() 方法的基本语法 -
哪里
- file_object 是 open() 函数返回的文件对象。
- hint 是一个可选参数,用于指定要读取的字节数。如果指定,则读取最多为指定字节的行,而不必读取整个文件。
例
在此示例中,我们在读取模式下打开文件 “example.txt”。然后我们使用 readlines() 方法从文件中读取所有行,并将它们作为字符串列表返回 -
上述代码的输出如下所示 -
Hi Surya.
How are you?.
使用 “with” 语句
Python 中的 “with” 语句用于异常处理。在处理文件时,使用 “with” 语句可确保文件在读取后正确关闭,即使发生异常也是如此。
例
下面是一个使用 with 语句打开、读取和打印文件内容的简单示例 -
我们得到的输出如下 -
Hi Surya.
How are you?.
以二进制模式读取文件
默认情况下,对文件对象的读/写操作是对文本字符串数据执行的。如果我们想处理不同类型的文件,例如媒体文件 (mp3)、可执行文件 (exe) 或图片 (jpg),我们必须通过在读/写模式中添加“b”前缀来以二进制模式打开文件。
写入二进制文件
假设 test.bin 文件已经以二进制模式写入 -
例
要读取二进制文件,我们需要以 'rb' 模式打开它。然后在打印之前对 read() 方法的返回值进行解码 -
它将产生以下输出 -
从文件中读取整数数据
要将整数数据写入二进制文件,应使用 to_bytes() 方法将整数对象转换为字节。
将整数写入二进制文件
以下是有关如何将整数写入二进制文件的示例 -
从二进制文件中读取整数
要从二进制文件中读回整数数据,请使用 from_bytes() 方法将 read() 函数的输出转换回整数 −
从文件中读取浮点数据
为了处理二进制文件中的浮点数据,我们需要使用 Python 标准库中的 struct 模块。此模块有助于在 Python 值和表示为 Python 字节对象的 C 结构之间进行转换。
将浮点数写入二进制文件
要将浮点数据写入二进制文件,我们使用 struct.pack() 方法将浮点数转换为 bytes 对象 -
从二进制文件中读取浮点数
要从二进制文件中读取浮点数据,我们使用 struct.unpack() 方法将 bytes 对象转换回浮点数 -
使用 “r+” 模式读取和写入文件
当打开文件进行读取时(使用 'r' 或 'rb'),除非关闭文件并以其他模式重新打开,否则无法写入数据。为了同时执行读取和写入操作,我们将 '+' 字符添加到 mode 参数中。使用 'w+' 或 'r+' 模式可以在不关闭文件的情况下同时使用 write() 和 read() 方法。
File 对象还支持 seek() 函数,该函数允许将读/写指针重新定位到文件中任何所需的字节位置。
语法
以下是 seek() 方法的语法 -
参数
- offset - 这是读/写指针在文件中的位置。
- whence − 这是可选的,默认为 0 表示绝对文件定位,其他值为 1 表示相对于当前位置的 seek,2 表示相对于文件末尾的 seerk。
以下程序以 'r+' 模式(读写模式)打开一个文件,在文件中查找某个位置,并从该位置读取数据 -
执行上述代码后,我们得到以下输出 -
在 Python 中同时读取和写入文件
当打开文件进行写入时(使用 'w' 或 'a'),无法从中读取,尝试这样做将引发 UnsupportedOperation 错误。
同样,当打开文件进行读取(使用 'r' 或 'rb')时,不允许写入该文件。要在读取和写入之间切换,通常需要关闭文件,然后以所需的模式重新打开它。
要同时执行读取和写入操作,可以将 '+' 字符添加到 mode 参数中。使用 'w+' 或 'r+' 模式可以同时启用 write() 和 read() 方法,而无需关闭文件。
此外,File 对象还支持 seek() 函数,该函数允许您将读/写指针重新定位到文件中任何所需的字节位置。
例在此示例中,我们以 'r+' 模式打开文件并将数据写入该文件。seek(0) 方法将指针重新定位到文件开头 -
从 Specific Offset 读取文件
我们可以使用 seek() 方法将文件的当前位置设置在指定的偏移量处。
- 如果使用 'a' 或 'a+' 打开文件进行追加,则任何 seek() 操作都将在下次写入时撤消。
- 如果文件仅用于使用 'a' 在 append 模式下写入,则此方法本质上是无操作,但它对于在启用读取(模式 'a+')的情况下以 append 模式打开的文件仍然很有用。
- 如果使用 't' 以文本模式打开文件,则只有 tell() 返回的偏移量是合法的。使用其他偏移量会导致未定义的行为。
请注意,并非所有文件对象都是可查找的。
例以下示例演示如何使用 seek() 方法对文件执行同步读/写操作。文件以 w+ 模式(读写模式)打开,添加一些数据,然后在特定位置读取和修改文件 -
以下是上述代码的输出 -
Updated file content: This is a cat race